c/c++指針和引用初識

引用

引用為對象起了另外一個名字.通過聲明符寫成&a的形式來定義引用類型

例如: ? int ?v = 1024;

? ? ? ? ? ? int &vr = v; ? ? //vr指向v ? ?是v的另一個名字

? ? ? ? ? ? int &ve; ? ?//這個是錯誤的. ?引用必須被初始化

注意:引用并不是對象,相反的,它只是一個已經存在的對象所起的另外一個名字

定義了一個引用之后,對其進行的所有操作都是在與之綁定的對象上進行的

? ? ? ? ? ? vr = 2;

? ? ? ? ? ? int a = vr;

為引用賦值,實際上是把值賦給了與引用綁定的對象上.獲取引用的值,實際上是獲取了與引用綁定的對象的值.同理,以引用作為初始值,實際上是以與引用綁定的對象作為初始值

? ? ? ? int ?&v3 = vr; ? ?//v3綁定到了那個與vr綁定的對象上,就是綁定到了v上 ?


指針

指針是"指向"另外一種類型的復合類型,與引用類似,指針也實現了對其他對象的間接訪問.

指針本身就是一個對象,允許對指針賦值和拷貝,而且在指針生命周期內它可以先后指向幾個不同的對象.

指針無須在定義時賦初值,和其他內置類型一樣,在塊作用域內定義的指針如果沒有被初始化,也將擁有一個不確定的值.

定義的指針類型的方法將聲明符寫成*d的形式,其中d是變量名.如果在一條語句中定義了幾個指針變量,每個變量前面都必須有符號*

例如: int *p1,*p2; ? // ? p1和p2都是指向int型對象的指針

? ? ? ? ? double d1,*d2;? // ? d1 是double型對象 ? ? d2是指向double對象的指針

獲取對象的地址

? ? ? 指針存放某個對象的地址,想要獲取該地址,需要使用取地址符 (&)

? ? ?例如: ?int v = 30;

? ? ? ? ? ? ? ? int *p = &v; ? // p存放變量v的地址 ?或者說p是指向變量v的指針

? ? ? ?注意:如果指針指向了一個其他類型的對象,對該對象的操作將會發送錯誤


空指針

? ? ? ? ? 空指針不指向任何對象,在試圖使用一個指針之前可以先檢查它是否為空

? ? ? ? ? 一下是生成空指針的幾個方方法:

? ? ? ? ? int *p = nullptr;

? ? ? ? ? ?int *p2 = 0;

? ? ? ? ? ?int *p3 = NULL;


void*指針

void*指針是一種特殊的指針類型,可以存放任意對象的地址


指針賦值

指針和引用都能間接訪問對象,其中引用本身并非一個對象,一旦定義了引用,就沒法在綁定到另外的對象,之后每次使用這個引用都是訪問它最初綁定的那個對象,而指針就沒有這個限制了.

int e = 10;

int *p1 = 0; ? ? ? ?// p1被初始化,但沒有指向任何對象

int *p2 = &e; ? ? //p2被初始化,存有 e 的地址

p1 = &e; ? ? ? ? ? ? //p1的值被改變,現在指向了e

*p1 = 0; ? ? ? ? ? ? ?//e的值被改變


指向指針的指針

一般來說,聲明修飾符的個數并沒有限制.當有多個修飾符連寫在一起時,按照其邏輯關系詳加解釋即可.以指針為例,指針是內存中的對象,像其他對象一樣也有自己的地址,因此允許把指針的地址在存放到另一個指針當中

通過*的個數可以區分指針的級別.也就是說**表示指向指針的指針,***表示指向指針的指針的指針,以此類推

例如: ? int va = 1024;

? ? ? ? ? ?int *p1 = &va; ? //p1指向一個int型的指針

? ? ? ? ? ?int **pp1 = &p1; //pp1指向一個int型的指針

指向指針的引用

引用本身不是一個對象,因此不能定義指向引用的指針.但指針是對象,所以存在對指針的引用

例如: ?int i = 42;

? ? ? ? ? int *p; ? ? ? ? ? ? ? //p是一個int型的指針

? ? ? ? ? int *&r = p; ? ? ? //r是一個對指針p的引用

? ? ? ? ? r = &i; ? ? ? ? ? ? ? ?//r引用了一個指針,因此給r賦值 &i ? 就是令p指向i

? ? ? ? ?*r=0; ? ? ? ? ? ? ? ? //解引用r得到 i,也就是p指向的對象,將 i 值改為0

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容