1. 程式人生 > >c/c++中指標的理解(初學者)

c/c++中指標的理解(初學者)

關於指標,大家肯定不陌生,一些初學者,想必會出現思緒混亂的情況,現在我就來幫大家縷一縷吧。(第一次寫微博 有點小緊張)
大家應該瞭解一些計算機對記憶體的管理方式吧。作業系統會將記憶體單元進行編號,這些編號都是有順序的,大家應該聽過作業系統分為32位和64位的吧,這個就是作業系統對記憶體的最大編號,32位只支援4G的個編號,64位支援8G個編號。舉個簡單的例子來說明一下吧(很多人都用圖書館,抽屜什麼的舉例子,其實我也想舉這樣的例子,但是有感覺太老舊了),我就來拿寫日記來說,每一天的日記都會寫在一頁或者多頁上面,而每一頁就相當於一個儲存單元,頁碼便是這個儲存單元的編號,我們寫的日記就相當於資料,我們需要將這些資料寫入記憶體中,但又要知道這些資料存在什麼地方,這個時候我們就要記住這個編號了,跟寫日記一樣,我需要看我寫的謀篇日記在哪裡,只需要看看目錄,這篇日記在那一頁就能很快找到,這個更類似於書。
看看程式碼吧

int a = 10 ;
// 這個大家應該很熟悉, 一個int型別的變數 a ,這個變數的值為10
// 解釋一下,我們現在只知道 變數a的值是10 但是我們不清楚 a儲存在記憶體的什麼地方
// 我們可以用&符號來看看 a 儲存在記憶體的那個地址裡
printf("a的地址=%d \n",&a); // a的地址=1606416232

這裡大家可能會說我說了一些廢話,我來解釋一下,說這些只是為後面解釋指標做個小小的鋪墊。
現在有一種變數 它的值使用來儲存地址編號的 這就是所謂的指標,我的理解。
我們來看下面
int* p = &a;


這裡想解釋一下 關於指標定義是後到底在什麼地方,我個人認為應該緊跟在型別的後面。(我的認為是 int 代表整型,int*則代表指向int型的指標型別。這樣p則是一個變數 指標變數 用來指向地址的 ,所以才會有這樣 int*p; p=&a
看看這個
&:表示取地址運算子。
*:表示取變數運算子。
可以看看這個例子。
int b = 51;
printf("%d",*(&b))
;
這個例子很好的說明了兩個運算子。
現在開始細細的講一下指標了,p是指標型別,它的值只能是地址,p =&a,就是把a的地址賦值給p。現在p的值就是a的地址了,我們知道了a的地址之後,就能很隨意的對a進行修改了(這裡不包括常量),比如我們*p得到這個地址上的資料*p =100;
,而當我們列印a的時候prinf("%d",a) 的時候,首先a會去對應的地址找到這個地址上的資料,這個時候發現原本這個資料是10,現在變成了100。
p同樣也是有儲存地址的,&p變可以知道p的地址了,我們想讓一個指標的值是p的地址,看看應該怎麼做
int* pp = &p //很明顯編譯器出錯,why?
明明 pp是一個指標 它的值也是一個地址 為什麼會出錯呢?
看看p指標跟pp 有什麼不同呢?
*p 可以得到地址上int型別的值。
看看pp
如果上面寫法可行
pp也應該得到int型別的值,但是我們通過公式可以看出 *pp == p 但是p不是一個int型別 而是int*型別。所以這樣的定義是不對的
正確的定義大家都是知道的 就是指向指標的指標
int** pp = &p;