C 中指標和引用的區別

2022-04-06 07:20:17 字數 2426 閱讀 9372

1、指標和引用的本質(是什麼)

(1)指標是存放記憶體位址的一種變數,特殊的地方就在它存放的是記憶體位址。因此,指標的大小不會像其他變數一樣變化,只跟當前平台相關——不同平台記憶體位址的範圍是不一樣的,32位平台下,記憶體最大為4gb,因此只需要32bit就可以存下,所以sizeof(pointer)的大小是4位元組。64位平台下,32位就不夠用了,要想記憶體位址能夠都一一表示,就需要64bit(但是目前應該沒有這麼大的記憶體吧?),因此sizeof(pointer)是8。

(2)引用的本質是「變數的別名」,就是給變數又重新起了乙個名字,既然是「別名」,那麼就一定要有本體。

2、宣告和初始化時的區別引用是變數的別名,別名就一定對應著乙個「本名」,因此必須在宣告時就初始化,且不能初始化為空。

3、使用時區別

(1)根據宣告和初始化時二者的區別,指標在宣告週期內隨時可能會為null,所以使用時一定要做檢查,防止出現空指標、野指標的情況;而引用則不用再操這個心,只要初始化了,在**都可以直接使用,再也不用擔心它會不會為空什麼的了。

(2)指標因為自己存的是乙個記憶體位址,既然可以存初始化(或者賦值)的位址,那麼在指標生命週期內就可以存其他的位址,只要你是同一型別(不同型別這個對應的型別偏移不一樣)的變數,對於指標都ok。

引用作為乙個變數aa的別名,在它的整個生命週期內,它只能「從一而終」,始終是第一次初始化它的那個變數的別名,在這期間任何對它的操作,都等同於對變數aa的操作。

talk is cheap,show you my code.

/*

* 指標和引用的例子 *

*/std::

string s1 = "蘿蔔"

; std::

string s2 = "青菜"

; std::

string s3 = "雞蛋"

; std::

string s4 = "

西紅柿"

;

/** 指標可以初始化為空 *

*/std::

string *p_str =null;

/** 引用一開始必須初始化 *

*/std::

string& r_str =s1;

p_str = &s2;

std::cout

<<"

我是指標

"<<*p_str* 青菜 *

*/std::cout

<<"

我是引用

"* 蘿蔔 *

*/std::cout

<<"

*********分別修改指標和引用***********

"

*/r_str = s3; /*

* 試圖讓r_str為s3的別名 *

*/p_str = &s4; /*

* p_str重新指向了s4 *

*/std::cout

<<"

我是指標

"<<*p_str* 西紅柿 *

*/std::cout

<<"

我是引用

"* 雞蛋 *

*/std::cout

<<"

*********檢視剛剛的修改對最初初始化的影響***********

"

*/std::cout

<<"

我是s1

"* 雞蛋 !!!注意 !!! *

*/std::cout

<<"

我是s2

"* 青菜 *

*/std::cout

<<"

我是s3

"* 雞蛋 *

*/std::cout

<<"

我是s4

"* 西紅柿 *

*//*

* 發現s1 "蘿蔔" 被變成了和s3一樣的"青菜",這也說明了任何對引用的操作都等同於操作原先的變數本身

相比較之下,指標就自由度很高了,想指向誰就指向誰,並不會影響任何之前指向過的變數

驚不驚喜,意不意外 :)

**/

4、總結

乙個不大恰當的比喻是,指標就像是乙個可以(注意是可以,但未必一定)到處沾花惹草(可以隨時指向任意位址)的「渣男」;而引用則像是乙個只能「從一(誰初始化就跟誰)而終」的「老實人」。

另外,根據scott meyers在《more effective c++》上所講,只有當你確定需要一開始就初始化,並且不需要再指向其他型別時 使用引用,否則你都應該使用指標。

小弟認識粗鄙淺薄,有不當之處,請大佬輕拍。

C 中 (指標引用)和 (指標)的區別

很久之前學的c 了,複習一下,指標是乙個存放位址的變數,而指標引用指的是這個變數的引用,眾所周知c 中如果引數不是引用的話會呼叫引數物件的拷貝建構函式,所以如果有需求想改變指標所指的物件 換句話說,就是要改變指標裡面存的位址 就要使用指標引用,在網上看到大佬的 簡單明瞭,如下 include usi...

C 中指標引用和指標的區別

指標 是位址 即記憶體單元的編號 指標變數 是乙個存放位址的變數 指標引用 指的是這個指標變數的引用 眾所周知c 中如果引數不是引用的話會呼叫引數物件的 拷貝建構函式 重新開闢一塊一模一樣的記憶體空間 所以如想改變指標變數裡面存的位址,就要使用指標引用 讀 前請先搞懂 二級指標 指標的指標 指向指標...

C 中指標和引用的區別

引用和指標 相同點 1.都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 引用是某塊記憶體的別名。區別 1.指標是乙個實體,而引用僅是個別名 2.引用使用時無需解引用 指標需要解引用 3.引用只能在定義時被初始化一次,之後不可變 指標可變 引用 從一而終 4.引用沒有 const,指標...