1. 程式人生 > >[Js-c++]c++中的指針、引用和數組名

[Js-c++]c++中的指針、引用和數組名

bsp code size 第一個 算術運算 意義 使用 記錄 地方

指針和引用學了好久,還是偶爾會弄混淆,簡單記錄分析一下區別吧,有記起來新的區別就不斷更新添加進去

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++中的指針、引用和數組名