C C 中的引用與指標

2022-05-02 23:27:11 字數 1753 閱讀 6091

想必大家對c++中的指標都有所了解,但是什麼是引用呢?c++11標準引入了「引用」的新功能。

引用(reference):給物件起了另外乙個名字,引用型別引用(refers to)另外一種型別,通過將宣告符寫成&d的形式來定義引用型別,其中d是宣告的變數名:

int val = 1024

;int &d = val;

可以認為變數名就是乙個可以操控記憶體的標籤,那麼引用就可以理解為另乙個標籤。新定義的標籤和原來的標籤都可以訪問存放在記憶體中的資料。

例如:

#include #include 

using

namespace

std;

//宣告

void add(int &a,int

b);bool& iszero(float

f);int

main()

//定義

void add(int &a,int

b)bool& iszero(float

f)

輸出結果為:

d is 0.2

val is 25

float 0.000000004 is zero

const

int &i = 10;

指標(pointer):是可以指向(point to)另外一種資料型別的資料型別,通過將宣告符寫成*d的形式定義指標,其中d是變數名。

取位址符(&):獲取物件的位址。

解引用符(*):獲取指標所指向的物件。

int v = 10

;int *p = &v;

int **m = &p;

p是乙個int型別的指標,指向乙個int型別,上面的例子中指向了變數v。

m是乙個int*型別的指標,指向乙個int*型別,上面的例子中指向了變數p。

這裡說指向某個物件就是指存放某個物件的位址。指標就是指位址,位址就是指標。指標變數就是存放記憶體單元編號的變數,或者說指標變數就是存放記憶體位址的變數。

這張解釋了上面這段**的位址指向問題,變數p存放了變數v的記憶體位址,變數m存放了變數p的記憶體位址。

在判斷某個物件的型別的時候,應該從右向左閱讀(離變數名最近的符號對變數型別有最直接的影響),比如

int ****p;

int ****&r = p;

上面的int ****p;離p最近的是第四個*,所以p是乙個指標,剩餘的部分確定該指標指向的型別,第四個*號左邊是int ***,所以指標p指向乙個int ***型別。再看變數r,離r最近的是&,所以r是引用,剩餘的部分確定該引用引用的型別,剩餘的是int ****,所以r引用了乙個int ****型別的變數。

空指標不指向任何物件,使用字面值null表示,c++11標準還提供了字面值nullptr也可以獲得空指標。

void*是一種特殊的指標型別,可用於存放任意物件的位址。乙個void*指標存放著乙個位址,這一點和其他指標類似。但是不能直接操作void *指標所指的物件,因為並不知道物件到底是什麼型別。如果要使用void *所指的物件,應該使用強制型別轉化。

引用和指標的比較:

1.引用不能引用null。

2.一旦引用被初始化引向某乙個物件後,它就不能再引向另乙個物件。指標可以多次改變指向的物件。

3.引用在建立的時候,必須初始化。指標可以在被建立時不被初始化,可以等需要的時才初始化。

4.引用不是物件,沒有實際的位址。指標是乙個物件,有實際的位址。指標不能指向引用(因為引用不是物件)。

c c 引用與指標

我們常用的引用都是左值引用,而什麼是引用呢,所為的引用其實就是給物件起了另乙個名字。要注意的是引用不是物件,同時,引用必須要進行初始化。看下 吧 int ival 1024 int refval ival 用 來表示refval是ival的引用 int refval2 這裡會報錯,因為引用必須初始化...

C C 中的引用和指標

引用又稱 別名,它可以最為物件的乙個名字,但它既不是物件的指標,也不是物件的副本。通過引用可以間接地操作物件,使用方式類似於指標,但不需要指標的語法。使用規則 1 引用被建立的同時必須被初始化,指標可以在任何時候被初始化 int a 12 int b a 正確 int c 錯誤 2 一旦引用被初始化...

C C 中的引用和指標

引用又稱 別名,它可以視為物件的乙個名字,但它既不是物件的指標,也不是物件的副本。通過引用可以間接地操作物件,使用方式類似於指標,但不需要指標的語法。使用規則 1 引用被建立的同時必須被初始化,指標可以在任何時候被初始化 int a 12 int b a 正確 int c 錯誤 2 一旦引用被初始化...