指標漫談(三) 有關指標初始化的問題

2021-07-24 13:28:33 字數 1163 閱讀 9017

最近才釐清指標初始化的問題,不知道大家有沒有同樣的困惑,就是指標的初始化到低幹了些什麼工作?到底是因為位址訪問操作符給了指標變數的位址還是編譯器分配的?

為了**清楚這個問題,我們先從普通變數看起,例如:

int a;

printf("%p",a);

a=10;

printf("%d\n%p\n",a,a)

在上面這段**中我們想展示的是a這個整形變數初始化之前和初始化之後的位址和值,我們已經知道高階語言的乙個特性就是可以使用變數的名字而不是變數的位址去訪問記憶體中的值,那麼變數的宣告就是做了這樣乙個工作,通過名字而不是位址去訪問硬體,這也就是高階語言優於組合語言之處。

我們想想對於變數a而言,在宣告的時候並沒有給它值,僅僅是起了名字,若作為全域性變數來說,編譯器將直接初始化為0,此時它的位址就是系統定好0000000。初始化就是給變數給值,這個過程中編譯器會自動給變數分配乙個位址。這個初始化之後a變數的位址就作為a變數的最終位址,也就是在該位址儲存了10這個數。若對於static變數來說,從程式一開始到程式結束a變數始終佔據這個位址,不會釋放或者另做他用,但對於自由變數來說就是隨用隨銷毀,在函式體中使用,完畢後就銷毀。

接下來再來看有關指標變數的初始化,我們必須先明白,對於指標而言,它的第一屬性仍然是變數,其次才是指標。那它的初始化和普通的變數就應該沒有實質的區別。來看一段**:

int a=10;

int *p;//宣告

p=&a;//繫結或者叫初始化

在上面**上我們宣告了乙個叫做*p的整形變數,為什麼用間接訪問操作符,其實就是乙個指標變數的符號而已,只是編譯器不允許你直接宣告為p,否則你就可以使用p,從語言角度上講用p也是也可以的。我們仔細思考下,作為全域性變數p的位址和他的值在初始化之前是多少?p的值應該是0,位址應該也是記憶體位址為0000000的位置。初始化的過程就是給變數p給了

新的儲存空間,只不過這裡初始化我們是p指向的位址聯絡在一起,

但需要明白的是p的儲存位置和a的儲存位置是不一樣的,不要誤解為因為有&的操作,p的值就變成a的位址。用間接訪問操作符解引用的過程才是將p指向的位址的內容拿出來,具體放在哪就是另乙個話題了,我們需要明白的是*p的過程才是實質用a的值的過程,p的值並不是因為指標引起的,而是由於 本身是變數的原因。

以上就是我對指標變數的初始化的一些理解,如有誤,還望大蝦予以指正!

有關指標初始化的誤區

今天在看code時發現自己的乙個盲點,趕緊寫下來 大意是這樣的 要獲取一段buffer的長度,假設bufferstart是指向buffer的指標 現在定義另乙個指標bufferend,並把bufferstart的值賦給它 uint8 bufferend bufferstart 這等價於 buffer...

初始化指標

includeusing namespace std int main nullptr 是 c 新標準引入的特性,visual c 2010 編譯器支援它。過去已經使用0或 null 編譯器將用 0代替此巨集 來初始化指標,當然它們現在仍然可以使用。但是,使用 nullptr 初始化指標要好得多。因...

未初始化指標問題

c和指標 書上說 int a a 12 這樣寫宣告乙個變數,但未對指標初始化 如果指標是函式的形參,比如 void func int a 樓主,你應該理解清楚什麼是指標 通俗的講,指標是乙個位址,指標的初始化就是讓指標指向乙個確定的位址。是指標的解引用符,意思是取指標指向的位址裡的資料。因此,int...