天天看點

C語言的數組名和對數組名取位址

下面我們來逐漸分析,下面是一段驗證這個問題的代碼

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,如需轉載請自行聯系原作者

繼續閱讀