#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;
}

 

輸出結果:

23 

 


 

用白話一點的說法來講的話 

  

&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;
}

 

輸出結果是

546 


意思就是說 

提款卡(num)顯示銀行(*num)內存款變成10(**num)

銀行帳戶(num[0])內的存款也會同步變成10(*num[0])

大明的(&num[0][0])存款是10(num[0][0])

 

以上~~~

之前學c++對雙指標的概念也是蠻模糊的 現在重新看一遍之後 有比較了解了 OTZ 寫的好累

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 botdog 的頭像
    botdog

    科技始終來自於惰性!!! 惰性萬歲

    botdog 發表在 痞客邦 留言(0) 人氣()