相信不少的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...