c primer 讀書筆記四

2021-08-14 16:14:42 字數 2096 閱讀 3315

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=42;

int *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*指標所指的物件,因為我們不知道這個物件到達是什麼型別

C Primer讀書筆記(四)

vector.resize與vector.reserve的區別 reserve是容器預留空間,但並不真正建立元素物件,在建立物件之前,不能引用容器內的元素,因此當加入新的元素時,需要用push back insert 函式。resize是改變容器的大小,並且建立物件,因此,呼叫這個函式之後,就可以引...

《C primer》讀書筆記四

模板引數的名字,在它被宣告為模板引數後,一直到模板宣告或定義的結束,都可以被使用,如果在全域性域中宣告了與模板引數同名的變數,則該變數被隱藏。typedef double type template class type class queue 模板引數的名字在模板參數列中只能被引入一次。在不同的了...

C primer 讀書筆記

第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...