做爲一種複合類型,與引用類似,指針實現了對其餘對象的間接訪問:指針
指針自己就是一個對象,容許對指針賦值和拷貝,並且在指針的生命週期內它能夠前後指向幾個不一樣的對象。code
指針無須在定義時賦初值。和其餘內置類型同樣,在塊做用域內定義的指針若是沒有被初始化,也將擁有一個不肯定的值。對象
*
定義指針類型的方法將聲明符寫成*d
的形式,其中d
是變量名。若是在一個語句中定義了幾個指針變量,每一個變量面前都必須有符號*
:生命週期
int *ip1,*ip2; double dp,*dp2;
&
指針存放某個對象的地址,要想獲取該地址,須要使用取地址符(操做符&)。ip
int *ip1, *ip2; // ip1和ip2是指向int型對象的指針 double dp, *dp2; // dp2是指向double型對象的指針,dp是double型對象
在聲明語句中,指針的類型實際上被用於指定它所指向的對象的類型,因此兩者必須匹配。若是指針指向了一個其餘類型的對象,對該對象的操做將發生錯誤。作用域
指針的值(即地址)應屬下列4種狀態之一:編譯器
指向一個對象。編譯
指向緊鄰對象所佔空間的下一個位置。基礎
空指針,意味着指針沒有指向任何對象。變量
無效指針,是除上述狀況的其餘值。試圖拷貝或以其餘方式訪問無效指針的值都將引起錯誤,編譯器並不負責檢查此類錯誤。
儘管第2種和第3種形式的指針是有效的,但顯然這些指針沒有指向任何具體對象,因此試圖訪問此類指針(假定的)對象的行爲不被容許。
若是指針指向了一個對象,則容許使用 解引用符(操做符*
)來訪問該對象。
int ival = 42; int *p = &ival; // p存放着變量ival的地址,或者說p是指向變量ival的指針 cout << *p;
對指針解引用會得出所指的對象,所以若是給解引用的結果賦值,實際上也就是給指針所指的對象賦值:
*p = 0; cout << * p
【注意】解引用操做僅適用於那些確實指向了某個對象的有效指針。
像&
和*
,既能做表達式裏的運算符,也能做爲聲明的一部分出現,符號的上下文決定了符號的意義:
int i = 42; int &r = i; // &緊隨類型名出現,所以是聲明的一部分,r是一個引用 int *p; // *緊隨着類型名出現,所以是聲明的一部分,p是一個指針 p = &i; // &出如今表達式中,是一個取地址符 *p = i; // *出如今表達式中,是一個解引用符 int &r2 = *p; // &是聲明的一部分,*是一個解引用符
在聲明語句中,&
和*
用於組成複合類型;在表達式中,它們的角色又轉變爲運算符。
空指針(null pointer)不指向任何對象,在試圖使用一個指針以前代碼能夠首先檢查它是否爲空。