指標和引用學了好久,還是偶爾會弄混淆,簡單記錄分析一下區別吧,有記起來新的區別就不斷更新新增進去
1、指標可以多次重新分配,引用在無法重新分配,而且必須在宣告的時候被初始化
2、指標可以指向空(即被定義為nullptr),但是引用必須指向乙個東西
3、不存在「引用計算」這種東西(但是你用 &d+5 這種的確不會報錯,也能算出來東西)
4、乙個指標在堆疊上有自己的記憶體位址和大小(x86上有4個位元組),而引用共享相同的記憶體位址(與原始變數),但是也占用堆疊上的一些空間。由於引用具有與原始變數本身相同的位址,因此可以安全地將引用視為同一變數的另乙個名稱。注意:指標指向的內容可以位於堆疊或堆上。同上參考。我在這個陳述中的主張並不是指標必須指向堆疊。指標只是乙個儲存記憶體位址的變數。這個變數在堆疊中。由於引用在堆疊上有自己的空間,並且位址與其引用的變數相同。更多關於堆疊vs堆。這意味著有乙個編譯器不會告訴你的引用的真實位址。
我們預設的一種規則:
· 在函式引數和返回型別中使用引用來提供有用和自我記錄的介面。
· 使用指標來實現演算法和資料結構。
有關於陣列名和指標:
表示式中的陣列名被編譯器當作乙個指向該陣列第乙個元素的指標。
下標總是與指標的偏移量相同.
在函式引數的宣告中,陣列名被編譯器當作指向該陣列的第乙個元素的指標(換言之,在函式呼叫的時候陣列名會退化成指標,但是 sizeof 函式取陣列大小的時候不是這樣)。
有關陣列名,指標,以及引用的加法:
陣列名和指標都可以做算術運算(但實際上乘除法應該是沒有意義的),但是陣列名做完運算不能賦值回去,指標則可以(換言之,對於陣列不能使用名自增自減運算子)
假設有乙個陣列 a[10]
1/*2a: 0012ff20
3&a: 0012ff20
4a+1: 0012ff24
5&a+1: 0012ff48
6*/
a和&a指向的是同一塊位址,但他們+1後的效果不同,a+1是乙個元素的記憶體大小(增加4),而&a+1增加的是整個陣列的記憶體大小(增加40)
&a取都得是整個陣列的位址!既陣列名取位址等價於對陣列取位址。(而不是想象中的,陣列名是指標,給指標取位址就是指標的指標)
目前還沒看到要用到&a這種寫法的地方
指標和陣列名
想要清楚的知道指標和陣列的本質區別還有處理方式,感覺繞不開看編譯器是如何處理的了,有時間可以上知乎搜搜有什麼編譯類的書籍,或者找個懂編譯的大神,在網上看到有一篇從編譯器角度剖析陣列名的,有所幫助,雖然沒有說到足夠深入讓我理解指標和陣列真正的本質是什麼 本文只是稍微說明一下自己的猜測和理解,可能存在有...
指標和陣列名
在學習c語言指標時候,老師告訴我們,陣列名就是指標,指向陣列首元素的位址。有如下 int main int argc,const char argv printf arr p n arr printf arr 1 p n arr 1 printf lu n sizeof arr printf n p...
陣列名和陣列名取位址 指標陣列和陣列指標的區別
一,首先我們先分析下陣列名和陣列名取位址的區別。我們都知道陣列名是陣列的首位址,然而對陣列名取位址又是什麼那?看下面一段程式你就會懂的。分析 由執行結果可知,陣列名a和 a的記憶體位址相同,我們已經知道a a 0 所以有a 1指向陣列中下乙個元素 即為在首位址2751180基礎上加int的位元組數4...