下面我們來逐漸分析,下面是一段驗證這個問題的代碼
Code:
#include<stdio.h>
int main()
{
int a[10];
printf("a:/t%p/n", a);
printf("&a:/t%p/n", &a);
printf("a+1:/t%p/n", a+1);
printf("&a+1:/t%p/n", &a+1);
return 0;
}
大家可以編譯運作一下,我的輸出的結果是:
/*
a: 0012FF20
&a: 0012FF20
a+1: 0012FF24
&a+1: 0012FF48
*/
a和&a指向的是同一塊位址,但他們+1後的效果不同,a+1是一個元素的記憶體大小(增加4),而&a+1增加的是整個數組的記憶體大小(增加40)。既a和&a的指向和&a[0]是相同的,但性質不同!
讀到這裡,有很多朋友已經明白其中的機制了,如果還是有些模糊,請繼續往下看
printf("%d/n",sizeof(a));
這段代碼會輸出整個數組的記憶體大小,而不是首元素的大小,由此我們是否聯系到,sizeof(a)這裡的a和
&a有些相同之處呢?! 是的,沒錯,&a取都得是整個數組的位址!既數組名取位址等價于對數組取位址。
好了,讓我們總結一下,如果你還是不太了解,不用擔心,下面的概念很清晰
其實a和 &a結果都是數組的首位址,但他們的類型是不一樣。
a表示&a[0],也即對數組首元素取位址,a+1表示首位址+sizeof(元素類型)。
&a雖然值為數組首元素位址,但類型為:類型 (*)[數組元素個數],是以&a+1大小為:首位址+sizeof(a)。
還有這篇文章最初提到的指針的指針的那個錯誤結論,其實即使不懂上述内容,也應該判斷出結論是錯誤的,大家應該在了解數組名即是數組的首位址的同時,也要知道,數組名僅僅是“相當”于指針,而并非真的是指針,數組名是隻是個常量(一個值為數組首元素位址的常量),是以不能進行++或者--運算。而常量更是無法取位址的,而之是以有&a,其實這裡的a的意義早已經不是當初那個數組名了,它此時代表了整個數組。
本文轉自莫水千流部落格園部落格,原文連結:http://www.cnblogs.com/zhoug2020/p/6053339.html,如需轉載請自行聯系原作者