引用
引用為對(duì)象起了另外一個(gè)名字.通過(guò)聲明符寫(xiě)成&a的形式來(lái)定義引用類(lèi)型
例如: ? int ?v = 1024;
? ? ? ? ? ? int &vr = v; ? ? //vr指向v ? ?是v的另一個(gè)名字
? ? ? ? ? ? int &ve; ? ?//這個(gè)是錯(cuò)誤的. ?引用必須被初始化
注意:引用并不是對(duì)象,相反的,它只是一個(gè)已經(jīng)存在的對(duì)象所起的另外一個(gè)名字
定義了一個(gè)引用之后,對(duì)其進(jìn)行的所有操作都是在與之綁定的對(duì)象上進(jìn)行的
? ? ? ? ? ? vr = 2;
? ? ? ? ? ? int a = vr;
為引用賦值,實(shí)際上是把值賦給了與引用綁定的對(duì)象上.獲取引用的值,實(shí)際上是獲取了與引用綁定的對(duì)象的值.同理,以引用作為初始值,實(shí)際上是以與引用綁定的對(duì)象作為初始值
? ? ? ? int ?&v3 = vr; ? ?//v3綁定到了那個(gè)與vr綁定的對(duì)象上,就是綁定到了v上 ?
指針
指針是"指向"另外一種類(lèi)型的復(fù)合類(lèi)型,與引用類(lèi)似,指針也實(shí)現(xiàn)了對(duì)其他對(duì)象的間接訪問(wèn).
指針本身就是一個(gè)對(duì)象,允許對(duì)指針賦值和拷貝,而且在指針生命周期內(nèi)它可以先后指向幾個(gè)不同的對(duì)象.
指針無(wú)須在定義時(shí)賦初值,和其他內(nèi)置類(lèi)型一樣,在塊作用域內(nèi)定義的指針如果沒(méi)有被初始化,也將擁有一個(gè)不確定的值.
定義的指針類(lèi)型的方法將聲明符寫(xiě)成*d的形式,其中d是變量名.如果在一條語(yǔ)句中定義了幾個(gè)指針變量,每個(gè)變量前面都必須有符號(hào)*
例如: int *p1,*p2; ? // ? p1和p2都是指向int型對(duì)象的指針
? ? ? ? ? double d1,*d2;? // ? d1 是double型對(duì)象 ? ? d2是指向double對(duì)象的指針
獲取對(duì)象的地址
? ? ? 指針存放某個(gè)對(duì)象的地址,想要獲取該地址,需要使用取地址符 (&)
? ? ?例如: ?int v = 30;
? ? ? ? ? ? ? ? int *p = &v; ? // p存放變量v的地址 ?或者說(shuō)p是指向變量v的指針
? ? ? ?注意:如果指針指向了一個(gè)其他類(lèi)型的對(duì)象,對(duì)該對(duì)象的操作將會(huì)發(fā)送錯(cuò)誤
空指針
? ? ? ? ? 空指針不指向任何對(duì)象,在試圖使用一個(gè)指針之前可以先檢查它是否為空
? ? ? ? ? 一下是生成空指針的幾個(gè)方方法:
? ? ? ? ? int *p = nullptr;
? ? ? ? ? ?int *p2 = 0;
? ? ? ? ? ?int *p3 = NULL;
void*指針
void*指針是一種特殊的指針類(lèi)型,可以存放任意對(duì)象的地址
指針賦值
指針和引用都能間接訪問(wèn)對(duì)象,其中引用本身并非一個(gè)對(duì)象,一旦定義了引用,就沒(méi)法在綁定到另外的對(duì)象,之后每次使用這個(gè)引用都是訪問(wèn)它最初綁定的那個(gè)對(duì)象,而指針就沒(méi)有這個(gè)限制了.
int e = 10;
int *p1 = 0; ? ? ? ?// p1被初始化,但沒(méi)有指向任何對(duì)象
int *p2 = &e; ? ? //p2被初始化,存有 e 的地址
p1 = &e; ? ? ? ? ? ? //p1的值被改變,現(xiàn)在指向了e
*p1 = 0; ? ? ? ? ? ? ?//e的值被改變
指向指針的指針
一般來(lái)說(shuō),聲明修飾符的個(gè)數(shù)并沒(méi)有限制.當(dāng)有多個(gè)修飾符連寫(xiě)在一起時(shí),按照其邏輯關(guān)系詳加解釋即可.以指針為例,指針是內(nèi)存中的對(duì)象,像其他對(duì)象一樣也有自己的地址,因此允許把指針的地址在存放到另一個(gè)指針當(dāng)中
通過(guò)*的個(gè)數(shù)可以區(qū)分指針的級(jí)別.也就是說(shuō)**表示指向指針的指針,***表示指向指針的指針的指針,以此類(lèi)推
例如: ? int va = 1024;
? ? ? ? ? ?int *p1 = &va; ? //p1指向一個(gè)int型的指針
? ? ? ? ? ?int **pp1 = &p1; //pp1指向一個(gè)int型的指針
指向指針的引用
引用本身不是一個(gè)對(duì)象,因此不能定義指向引用的指針.但指針是對(duì)象,所以存在對(duì)指針的引用
例如: ?int i = 42;
? ? ? ? ? int *p; ? ? ? ? ? ? ? //p是一個(gè)int型的指針
? ? ? ? ? int *&r = p; ? ? ? //r是一個(gè)對(duì)指針p的引用
? ? ? ? ? r = &i; ? ? ? ? ? ? ? ?//r引用了一個(gè)指針,因此給r賦值 &i ? 就是令p指向i
? ? ? ? ?*r=0; ? ? ? ? ? ? ? ? //解引用r得到 i,也就是p指向的對(duì)象,將 i 值改為0