int i = 3 ;
int *p ;
p = &i ;
int *q = p;
問題:先定義一個數值為3的變量 i 。然後把i的地址傳遞給變量p。那麼變量p的內存單元中存儲的就是i的地址,假如說是2000,那麼p就是2000.
*p就是間接訪問i,也就是說*p是3.
再定義一個變量q。*q也是間接訪問的數值,這裡等於p,也就是說*q 是2000.
我的理解是內存中存在一個變量,裡面存的是2000.那麼我如果輸出q。那麼就應該是
內存中數值為2000的這個變量的地址對嗎?至於數值等於2000是哪一個地址,我不知道,但是這裡的*q確實是間接訪問了數值為2000的變量,假如存在無數多個這樣的地址,那麼最少計算機也應該隨機輸出一個地址才對。
但運行的結果 *q的值等於i 等於 2;而q 存儲地址的數值等於p的存儲地址的值。
那麼剛剛我列出的是*q = p 。而計算機實際上運行的結果怎麼就是q = p 呢?
代碼:
# include
main(){
int i = 2 ;
int *p ;
p = &i ;
int *q = p;
printf("%d\n",*q);
printf("%d\n",q);
printf("%d\n",*p);
printf("%d\n",p);
}
首先int * p表示p是變量,它的類型是int *,也就是說p只能存儲int類型變量的地址,此處不能將*p可作變量。
所以
int i = 2;
int * p;
p = &i;
等價於
int i = 2;
int * p = &i;
同樣你下面的
int * q = p;
應該理解成定義了一個q變量,它的類型是int *,意思就是q變量中只能存儲int類型變量的地址
這句其實只是給q變量賦值,意思是你把p變量的值賦給了q。
而p變量中保存了i的地址,所以q變量中此時也保存了i變量的地址。
這樣的話p變量和q變量同時指向了i變量在內存中的那塊存儲單元。
此時*p和*q完全等價於i變量,所以輸出*q是i的值,說出q是i變量的地址
系統本身會為p變量分配內存單元,這個內存單元是用來存儲i變量的地址200
但p變量本身分配的內存單元編號(內存單元編號就是地址)絕對不是這個2000,是另外一個值。
如果q中真想保存p變量本身的地址,實際上需要多級指針變量int ** q = &p,