c c 引用與指標

2021-08-21 19:00:03 字數 2854 閱讀 7743

我們常用的引用都是左值引用,而什麼是引用呢,所為的引用其實就是給物件起了另乙個名字。要注意的是引用不是物件,同時,引用必須要進行初始化。

看下**吧:

int ival = 1024;

int &refval = ival; // 用 & 來表示refval是ival的引用

int &refval2; // 這裡會報錯,因為引用必須初始化

為什麼必須進行初始化呢?因為在定義引用的時候,程式把引用和他的初始值繫結在一起,記住,繫結不是拷貝,也就是說如果你對利用引用修改值,那麼被引用的物件的值也會發生變化。並且,引用一旦繫結之後就不可更改,這也就是為什麼引用必須初始化的原因。

//用**舉個例子吧

int ival = 1024;

int &refval = ival;

refval = 3;

cout《引用的定義

允許在一條語句中定義多個引用,當然,每個引用的標誌符都必須以&開頭:

int i = 1, i2 = 2;//定義兩個普通的int型別

int &j = i, k = i2;//其中j是對i的引用,k是普通的int變數

int &m = i, &n = m;//m是對i的引用,而n是對i的引用的引用,其實就是這個意思,給小李取了乙個外號叫

//李子,然後又給李子取了個外號叫木子

&j = i2;//error:expression is not assignable

指標是指向另外一種型別的復合型別,用來存放物件的位址。和引用相似,指標也實現的對其他物件的簡介訪問。然而指標和引用相比有著許多的不同之處。首先,指標本身就是乙個物件,由宣告符*和變數名組成如:*p。所以指標可以不初始化(但這樣做會出現問題,後面再講,不過編譯器是不會報錯的),因此也允許對齊進行賦值和拷貝。第二,指標所指向的物件可以隨時改變。

int i  = 1;

int *p = &i; // 這裡的&是去位址符。不是引用的意思,表示p存放i的位址

int *p1,*p2; // 編譯器不會報錯,因為指標可以不初始化

p1 = p; // p1和p同時指向i

利用指標訪問物件

如果指標指向了乙個物件,可以使用解引用符* 來訪問該物件。

可能會有疑惑,如同引用& 和位址&,指標*和解引用*,其實代表不是同樣的東西,只是寫法相同罷了(我就是這麼理解的,具體代表什麼意思看情況而定,應該還是好分辨的)

比如我們要輸出i的值,可以這樣:

cout<<*p《通過解引用符*來獲取p所存的位址的物件的值。

空指標

空指標不指向任何物件,在試圖使用乙個指標之前**可以首先檢查它是否為空。以下列出幾個生成空指標的方法:

int *p = nullptr;//c++11的一種新方法,就是空的意思

int *p1 = 0;//直接初始化為字面常量0

int *p2 = null;//其實和上面等於0時一樣的

其他指標操作

int ival = 11;

int *p1 = &ival;

int *p2 = 0;

if(p1)

{cout<<"p1 is true"《原因就是,如果指標的值是0,條件取false,否則,全部為true。這裡說一下 ,如果是nullptr的話,直接理解空和非空就好了。

void* 指標

void* 是一種特殊的指標型別,用於存放任何物件的位址。但是,我們永遠無法理解該位址的物件是什麼型別的,這也就導致我們無法直接操作void*指標所指的物件,換句話說就是問無法通過void*來訪問記憶體空間中所儲存的物件。

int obj = 2;

double * p2 = 0;

void* p3 = &obj;

p3 = p2;

指向指標的指標

先說一下變數吧,變數的定義包括乙個基本的資料型別和一組宣告符(比如 int *p , int是資料型別,*是宣告符中的修飾符,p是名字)。並且宣告符中的修飾符的個數並沒有限制。如下:

int ival = 22;

int *p = &ival; //p指向ival

int **pp = &p; //pp 指向乙個int形的指標

int ***ppp = &pp; //ppp 指向乙個指向int型的指標的指標

如果想輸出ival的話也有很多方法:

cout<<*p《指向指標的引用

上面也說過了,引用本身並不是乙個物件,而只是乙個別名(外號),因此不能定義指向引用的指標,但指標是乙個物件,所以存在對指標的引用。是不是有點繞,所以看**可能會好理解點。

int ival = 11;

int *p = &ival;//這句話其實可以拆成兩句話。int *p, p = &ival;

int **pp = &p;

int *&r = p; //從右向左讀吧,其中&代表r是乙個引用,*代表其是對指標的引用

int **&rr = pp;//一樣的道理 **代表其事對指標的指標的引用

*r = 22;

cout《以上內容許多是參考c++primer 這本書的,也別說抄襲了,因為這篇部落格更多的是一種學習筆記吧,全部手打的。博主本人也水平有限,大概加了一點自己的嘗試和想法,希望共同進步吧。

C C 中的引用與指標

想必大家對c 中的指標都有所了解,但是什麼是引用呢?c 11標準引入了 引用 的新功能。引用 reference 給物件起了另外乙個名字,引用型別引用 refers to 另外一種型別,通過將宣告符寫成 d的形式來定義引用型別,其中d是宣告的變數名 int val 1024 int d val 可以...

C C 指標和引用

指標是c語言的靈魂。通過指標,可以輕鬆地訪問記憶體中的資料,對資料進行讀寫 概念 指標是變數,用來存放記憶體位址,位址一般用16進製制的數字表示,用來唯一標識一塊記憶體,我們可以通過 獲取變數的位址 指標變數的定義語法 資料型別 變數名 指標變數與普通變數的區別 普通變數存放資料,指標變數存放位址 ...

C C 定義指標的引用

c 中定義指標的引用有什麼好處呢?首先指標引用的定義方式 以char型別為例 char ptr 我們知道在c語言中如果想改變實參指標所指向的位置,就要定義重指標,如下面的例子 錯誤 實參指標不能被賦值 void changeptr char ptr 如果要想改變實參指標所指向的位址,則需要定義重指標...