c++ primer 讀書筆記四

2.3.2指針
指針本身就是一個對象,允許對指針賦值和拷貝,而且在指針的生命週期內它可以先後指向幾個不同的對象。
指針無須在定義是賦值。和其他內置類型一樣,在塊作用域內定義的指針如果沒有被初始化,也將擁有一個不確定的值。
如果在一條語句中定義了幾個指針變量,每個定義了幾個指針變量,每個變量前面都必須有符號*:
int *pt1,*ip2;
double dp,*dp2;

獲取對象的地址
指針存放某個對象的地址,要想獲取該地址,需要取該地址符
int ival=42;
int *p=&ival;

第二條語句把p定義爲一個指向int的指針,隨後初始化p令其指向名爲ival的int對象。因此引用不是對象。沒有實際地址,所以不能定義指向引用的指針

類型要嚴格匹配:

double dval;
double *pd=&dval;
double *pd2=pd;

int*pi=pd;錯誤
pi=&dval;錯誤

指針值
1指向一個對象
2指向緊臨對象所佔空間下一個位置
3空指針,意味着指針沒有指向任何對象
4無效指針,也就是上述情況之外的其他值

利用指針訪問對象
如果指針指向一個對象,則允許使用解引用符來訪問對象:
int ival=42;
int *p=&ival;//p存放這變量ival的地址,或者說p是指向變量ival的指針
cout<<*p;
由符號*得到p指針所指的對象,輸出爲42
對指針解引用會得出所指的對象,因此如果給解引用的結果賦值,實際上也就是所給指針指的對象賦值:
*p=0;
cout<<*p;輸出爲0

空指針
空指針不指向任何對象,在試圖使用一個指針之前代碼可以首先檢查是否爲空,以下列出幾個生成空指針的方法:
int *p1=nullptr;
int *p2=0;
int *p3=NULL;

錯誤的地方:
int zero=0;
pi=zero;//錯誤:不能把int變量直接賦給指針

賦值和指針
指針和引用都能提供對其他對象的間接訪問,然而在劇吐實現細節上兩者有很大不同,其中最重要的一點就是引用本身並非一個對象。一旦定義了引用,就無法再令其綁定其他對象,之後每次使用這個引用都是訪問它最初綁定的那個對象。
指針和它存放的地址之間就沒有這種限制了。和其他任何變量一樣

指針和它存放的地址之間就沒有這種限制了。和其他任何變量一樣,
給指針賦值

int i=42int *pi=0//pi被初始化,但沒有指向任何對象
int *pi2=&i;//pi2被初始化,存有i的地址
int *pi3;//pi3的值是無法確定的

pi3=pi2//pi2和pi3指向同一個對象i
pi2=0;現在pi2不在指向任何對象

想要搞清楚改變的是指針的值還是改變了指針所指對象的值不太容易,賦值永遠改變的是等號左側的對象

pi=&ival//pi的值被改變,現在pi指向ival
*pi=0;
則*pi發生改變

指針是0,條件取false:

int ival=1024;
int *pi=0;
int *

void*指針
void*是一種特殊的指針類型,可以存放任意對象的地址。一個void*指針存放這一個地址,這一點和其他指針類似。不同的是,我們對該地址中到底是個什麼類型的對象不瞭解:
double obj=3.14, *pd=&obj

double obj=3.14,*pd=&obj;
void *pv=&obj;//obj可以是任意類型的對象
pv=pd//pv可以存放任意類型的指針

void*指針能做的事:拿它和別的指針比較,作爲函數的輸入或輸出,或者賦給另一個void*指針。不能直接操作void*指針所指的對象,因爲我們不知道這個對象到達是什麼類型

發佈了28 篇原創文章 · 獲贊 3 · 訪問量 4449
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章