1. 程式人生 > 其它 >C++指標和引用的區別

C++指標和引用的區別

技術標籤:C++c++

#C++指標和引用的區別

1. 指標和引用的定義和性質區別

  1. 指標:本質是變數,這個變數儲存的是指向儲存單元的地址, 需要分配空間。
    引用只是變數的別名,不需要分配空間。

  2. 指標在定義的時候不一定要初始化,並且指向的空間可變;
    引用定義的時候必須初始化,並且不能改變(引用的值不能為NULL)。

  3. 有多級指標,無多級引用;有const指標,無const引用。

  4. 指標的自增為指向下一個空間,而引用是引用的變數加1

  5. sizeof引用是變數(物件)的大小,而sizeof指標是指標本身的大小。

  6. 引用訪問一個變數時直接訪問,而指標是間接訪問。

  7. 作為引數傳遞時,指標是傳值,傳遞的是指標的地址;傳引用是傳地址,傳遞的是變數的地址。

2.指標和引用作為函式引數進行傳遞時的區別

  1. 指標引數傳遞本質上是值傳遞,它所傳遞的是一個地址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,會在棧中開闢記憶體空間以存放由主調函式傳遞進來的實參值,從而形成了實參的一個副本(替身)。
    
  2. 引用引數傳遞過程中,被調函式的形式引數也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的地址。被調函式對形參(本體)的任何操作都被處理成間接定址,即通過棧中存放的地址訪問主調函式中的實參變數(根據別名找到主調函式中的本體)。因此,被調函式對形參的任何操作都會影響主調函式中的實參變數。
  3. 引用傳遞和指標傳遞是不同的,雖然他們都是在被調函式棧空間上的一個區域性變數,但是任何對於引用引數的處理都會通過一個間接定址的方式操作到主調函式中的相關變數。而對於指標傳遞的引數,如果改變被調函式中的指標地址,它將應用不到主調函式的相關變數。如果想通過指標引數傳遞來改變主調函式中的相關變數(地址),那就得使用指向指標的指標或者指標引用。
#include <iostream>
using namespace std;

//通過改變指向的內容來改變實參的值
void swap1(int *p, int *q)
{
	int tmp = *p;
	*p = *q;
	*q = tmp;
}
//通過間接定址,改變是實參的值
void swap2(int &p, int &q)
{
	int t = p;
	p = q;
	q = t;
}
//無法改變形參的值
void swap3(int *p, int *q)
{
	int *t = p;
	p = q;
	q = t;
}

void main()
{
	int
a = 10, b = 5; std::cout << "a = " << a << " b = " << b << std::endl; swap1(&a, &b); std::cout << "a = " << a << " b = " << b << std::endl; swap2(a, b); std::cout << "a = " << a << " b = " << b << std::endl; swap3(&a, &b); std::cout << "a = " << a << " b = " << b << std::endl; std::cin.get(); }

輸出結果
在這裡插入圖片描述