#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int num[3][4];
num[0][0]=1;
printf("num=%p\n",num); //看num內的值
printf("&num=%p\n",&num); //看num的記憶體位置
printf("*num=%p\n",*num); //看num所指目標的值
printf("**num=%p\n",**num); //看num所指目標的目標的值
printf("\n");
printf("num[0]=%p\n",num[0]); //看num[0]的值
printf("&num[0]=%p\n",&num[0]); //看num[0]記憶體位置
printf("*num[0]=%p\n",*num[0]); //看num[0]所指目標的值
system("pause");
return 0;
}
輸出結果:
用白話一點的說法來講的話
&num = &num[0] = &num[0][0] = 002ff40
這三個都是再同一個記憶體位置
num --> &num[0] = 002f40 ; num[0] --> &num[0][0] = 002f40
num指向 &num[0] 所以num=002f4 num[0]指向 &num[0][0] 所以 num[0]=0024f0
*num --> num[0] --> &num[0][0] = 002f40
*num是指向 num[0] 而 num[0]又指向&num[0][0] 所以 *num=00f240 num[0]=0024f0
**num --> *num[0] --> num[0][0] = 1
**num指向*num[0] 而*num[0]又指向 num[0][0] 所以**num=1 *num[10]=1
結構大致上是這樣
以生活例子來說:
大明的(&num[0][0]=大明的) 存款有1000元(num[0][0]=1000) 銀行帳戶(num[0]=銀行帳戶)內的錢有1000元(*num[0]=1000)
提款卡(num=提款卡)的餘額要和銀行帳戶(*num=銀行帳戶)一樣有1000元(**num=1000)
因為 銀行帳戶和提款卡都是大明的 所以(&num[0][0]=&num[0]=&num)
關係類似這樣........(想到頭快炸了 囧)
在舉一個例子
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int num[3][4];
num[0][0]=1;
printf("num=%p\n",num);
printf("&num=%p\n",&num);
printf("*num=%p\n",*num);
printf("**num=%d\n",**num);
printf("\n");
printf("num[0]=%p\n",num[0]);
printf("&num[0]=%p\n",&num[0]);
printf("*num[0]=%p\n",*num[0]);
**num =10; //改變**num的值 觀察其他的變化
printf("**num=%d\n",**num);
printf("*num[0]=%d\n",*num[0]);
printf("num[0][0]=%d\n",num[0][0]);
system("pause");
return 0;
}
輸出結果是
意思就是說
提款卡(num)顯示銀行(*num)內存款變成10(**num)
銀行帳戶(num[0])內的存款也會同步變成10(*num[0])
大明的(&num[0][0])存款是10(num[0][0])
以上~~~
之前學c++對雙指標的概念也是蠻模糊的 現在重新看一遍之後 有比較了解了 OTZ 寫的好累