C語言的陣列名和對陣列名取位址

2021-09-30 11:41:26 字數 1111 閱讀 3860

相信不少的c語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到:給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。

下面我們來逐步分析,下面是一段驗證這個問題的**

code:

#include

intmain()     

大家可以編譯執行一下,我的輸出的結果是:

code:

/*  

a:          0012ff20 

&a:         0012ff20 

a+1:        0012ff24 

&a+1:       0012ff48 */

a和&a指向的是同一塊位址,但他們+1後的效果不同,a+1是乙個元素的記憶體大小(增加4),而&a+1增加的是整個陣列的記憶體大小(增加40)。既a和&a的指向和&a[0]是相同的,但性質不同!

讀到這裡,有很多朋友已經明白其中的機制了,如果還是有些模糊,請繼續往下看

code:

intmain()     

這段**會輸出整個陣列的記憶體大小,而不是首元素的大小,由此我們是否聯絡到,sizeof(a)這裡的a和

&a有些相同之處呢?!  是的,沒錯,&a取都得是整個陣列的位址!既陣列名取位址等價於對陣列取位址。

好了,讓我們總結一下,如果你還是不太理解,不用擔心,下面的概念很清晰

其實a和 &a結果都是陣列的首位址,但他們的型別是不一樣。

a表示&a[0],也即對陣列首元素取位址,a+1表示首位址+sizeof(元素型別)。

&a雖然值為陣列首元素位址,但型別為:型別 (*)[陣列元素個數],所以&a+1大小為:首位址+sizeof(a)。

還有這篇文章最初提到的指標的指標的那個錯誤結論,其實即使不懂上述內容,也應該判斷出結論是錯誤的,大家應該在了解陣列名即是陣列的首位址的同時,也要知道,陣列名僅僅是「相當」於指標,而並非真的是指標,陣列名是只是個常量(乙個值為陣列首元素位址的常量),所以不能進行++或者--運算。而常量更是無法取位址的,而之所以有&a,其實這裡的a的意義早已經不是當初那個陣列名了,它此時代表了整個陣列。

C語言的陣列名和對陣列名取位址

相信不少的c語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...

C語言的陣列名和對陣列名取位址

相信不少的c語言初學者都知道,陣列名相當於指標,指向陣列的首位址,而函式名相當於函式指標,指向函式的入口位址。現在又這樣乙個問題,如果對陣列名取位址,那得到的會是什麼呢?很多人立刻會想到 給指標取位址,就是指標的指標,既二級指標嘛!當然這樣的結論是錯誤的,不然這篇筆記也就沒有意義了。下面我們來逐步分...

陣列名和陣列名取位址

在c中,在幾乎所有使用陣列的表示式中,陣列名的值是個指標常量 也就是陣列第乙個元素的位址。它的型別取決於陣列元素的型別 如果它們是int型別,那麼陣列名的型別就是 指向int的常量指標 在以下兩種場合下,陣列名並不是用指標常量來表示,就是當陣列名作為sizeof操作符和單目操作符 的運算元時。siz...