開始寫部落格了,技術書籍讀了一些,可看完就忘,每次遇到問題都是 感覺在哪見過之後從新找,受夠了這種低效而又愚蠢的學習方法,看到有很多大牛都在部落格上記錄技術鄙人向之學習,本著開源精神共享技術。
一 指標和記憶體
程式被編譯後要在記憶體中執行,不同的資料有不同的使用記憶體的方法,c語言程式有三種:
1)靜態/全域性記憶體
這種資料事先在程式中宣告為全域性變數 區域性靜態變數或全域性靜態變數,在程式開始執行時分配記憶體,程式執行結束後,該資料消失;
2)自動記憶體
這種資料一般宣告在函式中,在函式呼叫是分配記憶體,呼叫結束後消失,整個作用域在函式中;
3)動態記憶體
在程式執行中,根據需要會動態的分配記憶體,通過malloc()或其它類似函式來不斷申請 消除 改變使用記憶體的大小,記憶體分配在堆上,直到釋放才消失,指標引用的記憶體的作用域侷限於引用記憶體的指標,該指標引用完這塊記憶體也失去了作用,應手動釋放。
指標在使用時的問題:1 訪問陣列或其它資料結構是越界;2自動變數消失後被引用;3 堆上分配的記憶體釋放後被引用;4 記憶體分配前解引指標
二 指標的引用
1 指向函式的指標
void (*foo)();
2 null為((void *)0)
3 需用sizeof來取指標的位元組數,比如sizeof(char *),指標的位元組數與記憶體結構有關和編譯器有關,相同環境下的說有指標長度相同(函式指標有待**);不同記憶體模型的資料長度也不同,記憶體模型(32位/64位)取決與作業系統和編譯器,一中系統可支援多種模型,這通常是編譯器選項來控制的;
4 指標和整數可進行加減;指標之間可以相減及比較大小;函式指標不一定具備這三種能力;
5 多層間接引用
char *title = ;
char **getstring[2];
getstring[0] = &title[0];
getstring[1] = &title[1];
6 常量與指標
1)指向常量的變數指標
int num;//const int num也可以
const int *pi;//不能通過*pi = num;來給num賦值,除此無其他限制;
a.pi可被修改為指向不同的整形變數或常量;
b.可以通過*pi讀取值;
c.不能通過*pi改變整形的值(僅此一條限制)
2)指向非常量的常量指標
int num;
int *const pi = #//pi必須初始化時賦值,後不能再修改pi;*pi可被修改
3)指向常量的常量指標
const int *const pi = #//指標不能修改,指向的資料不能修改
4)指向 指向常量的常量指標的指標
const int *const *pi;
三 小結
1 在不同場合小如何宣告和使用指標;
2 null的概念和變種((void *)0);
3 指標的長度是可變的,他取決目標系統和編譯器支援的記憶體模型;
4 const和指標的使用
C 和記憶體指標
雖然到了.net 的runtime 時代,c 仍然是不可磨滅的主要支柱,包括在msdn 裡見到的api 大部都是有指標型別存在,那麼在以c 冠首的c 裡應當如何去使用指標呢?其實,c 裡可以直接使用結構型的變數引用進api,但是畢竟它不是指標在對一些涉及以結構陣列存放的記憶體區操作可能就力有不及了,...
C 和記憶體指標
c 和記憶體指標 關 鍵 詞 serverword.net 雖然到了.net 的runtime 時代,c 仍然是不可磨滅的主要支柱,包括在msdn 裡見到的api 大部都是有指標型別存在,那麼在以c 冠首的c 裡應當如何去使用指標呢?其實,c 裡可以直接使用結構型的變數引用進api,但是畢竟它不是指...
指標和記憶體講解
指標賦值,如果沒有明確的位址可以賦值為null,int p null null位址為0x0.判斷指標位址是否為零位址if 如果p非空,則完成 if p 如果p空,則完成 指標的算術運算 p 指標的加法是位址的加 p是位址記憶體的資料 char up asdfghjkl up up 0 是第乙個位址內...