徹底講明白C 中指標和引用的區別到底是啥!

2021-09-13 01:30:02 字數 2333 閱讀 6828

學過c的都知道指標,剛開始學習指標的時候,都會覺得指標很難,學完了指標才發現指標就是儲存的位址。指標十分不安全,使用的不恰當,就會使程式出錯!c++裡面提出了「引用」代替指標,提高程式的安全性。下面來講講什麼是引用。

引用是給另外乙個變數起別名,繫結乙個變數,所以引用不會分配記憶體空間。對引用的所有操作,事實上都是作用在該引用所繫結的物件上。

引用的宣告方法:型別識別符號 &引用名=目標變數名;(如int &ptr = num;)

從執行結果來看,num這個指標的值就是a的位址,而b的位址和a的位址相同,說明b和a是同乙個記憶體單元格,只是有2個名字而已,就相當於對記憶體區域0028ff18這個單元格起了2個名字,叫a和b。你用a和b都可以訪問0028ff18這個單元格。a和b就是乙個東西。

1、指標是乙個實體,需要分配記憶體空間(你建立乙個指標變數int *p,那麼這個p必須在記憶體中占有乙個單元格(其實是4個位元組),它所佔的單元格裡面可以填乙個位址,來表示它指向**。)。引用只是變數的別名,不需要分配記憶體空間(引用是對已經存在的乙個單元格來說的,單元格已經存在了,引用就是對單元格再起乙個名字,這個引用呢,不再在記憶體中儲存了,參見上面的例子)。

2、引用在定義的時候必須進行初始化,並且不能夠改變(引用是針對已經存在的某個單元格進行二次命名,所以單元格必須先存在)。指標在定義的時候不一定要初始化,並且指向的空間可變。(注:不能有引用的值不能為null)

3、有多級指標,但是沒有多級引用,只能有一級引用。

4、指標和引用的自增運算結果不一樣。(指標是指向下乙個空間,引用時引用的變數值加1)

5、sizeof 引用得到的是所指向的變數(物件)的大小,而sizeof 指標得到的是指標本身的大小。

6、引用訪問乙個變數是直接訪問,而指標訪問乙個變數是間接訪問。

使用引用有何優點?

在傳參的時候,使用指標傳參,編譯器需要給指標另行分配儲存單元,儲存乙個該指標的副本,在函式中對這個副本進行操作;而使用引用傳參,編譯器就不需要分配儲存空間和儲存副本了,函式將直接對實參進行操作。所以使用引用使得程式的執行速度更快,執行效率更高。

1. 交換數字

通過上面的例子我們發現,使用引用作為引數進行函式定義的好處:只需要在函式定義(void swap(&a,&b))的時候,將引數寫成引數的引用形式。在實參的定義時只管寫實參就行(int a,b;),在函式呼叫時,傳進去的也是實參(swap(a,b)),根本不需要用指標或者引用符。 

專業點說,就是引用在函式傳參的時候,只需要傳變數名過去,函式形參用引用接即可。而指標在傳參的時候,必須傳變數的位址過去,否則不能改變變數的值。

引用沒有分配記憶體空間,所以訪問函式形參就是訪問引用的變數,是直接訪問。而指標分配了記憶體空間用來儲存變數的位址,需要通過儲存的位址找到指向的變數,是間接訪問。

2. 作為函式返回型別

#include using namespace std;

int& func(int &tmp)

int main()

結果:

num = 1

change num = 3

3. 引用、指標、指標引用等

int val3 = 100;

int &value3 = val3; // 定義乙個【引用】 ,和變數val3繫結到一起

int *ptr3 = &val3; // 定義乙個【指標】,其值為val3的位址,也就是ptr3指向了val3所在的記憶體單元,該單元的內容是100

int *&refp3 = ptr3; //將乙個【指標引用】和乙個指標繫結起來,那麼refp就是乙個【指標引用 】 ,它和ptr3是乙個東西

cout << "val3 的值: " << val3 << endl;

cout << "value3 的值: " << value3 << endl;

參考:

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

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

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

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

C 中指標和引用的區別

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