[Js-c++]c++中的指針、引用和數組名
指針和引用學了好久,還是偶爾會弄混淆,簡單記錄分析一下區別吧,有記起來新的區別就不斷更新添加進去
1、指針可以多次重新分配,引用在無法重新分配,而且必須在聲明的時候被初始化
2、指針可以指向空(即被定義為nullptr),但是引用必須指向一個東西
3、不存在“引用計算”這種東西(但是你用 &d+5 這種的確不會報錯,也能算出來東西)
4、一個指針在堆棧上有自己的內存地址和大小(x86上有4個字節),而引用共享相同的內存地址(與原始變量),但是也占用堆棧上的一些空間。由於引用具有與原始變量本身相同的地址,因此可以安全地將引用視為同一變量的另一個名稱。註意:指針指向的內容可以位於堆棧或堆上。同上參考。我在這個陳述中的主張並不是指針必須指向堆棧。指針只是一個保存內存地址的變量。這個變量在堆棧中。由於引用在堆棧上有自己的空間,並且地址與其引用的變量相同。更多關於堆棧vs堆。這意味著有一個編譯器不會告訴你的引用的真實地址。
我們默認的一種規則:
· 在函數參數和返回類型中使用引用來提供有用和自我記錄的接口。
· 使用指針來實現算法和數據結構。
有關於數組名和指針:
表達式中的數組名被編譯器當作一個指向該數組第一個元素的指針。
下標總是與指針的偏移量相同.
在函數參數的聲明中,數組名被編譯器當作指向該數組的第一個元素的指針(換言之,在函數調用的時候數組名會退化成指針,但是 sizeof 函數取數組大小的時候不是這樣)。
有關數組名,指針,以及引用的加法:
數組名和指針都可以做算術運算(但實際上乘除法應該是沒有意義的),但是數組名做完運算不能賦值回去,指針則可以(換言之,對於數組不能使用名自增自減運算符)
假設有一個數組 a[10]
1 /* 2 a: 0012FF20 3 &a: 0012FF20 4 a+1: 0012FF24 5 &a+1: 0012FF48 6 */
a和&a指向的是同一塊地址,但他們+1後的效果不同,a+1是一個元素的內存大小(增加4),而&a+1增加的是整個數組的內存大小(增加40)
&a取都得是整個數組的地址!既數組名取地址等價於對數組取地址。(而不是想象中的,數組名是指針,給指針取地址就是指針的指針)
目前還沒看到要用到&a這種寫法的地方
[Js-c++]c++中的指針、引用和數組名