宣告
int *ipl,*ip2; // ipl和 ip2 都是指向 int 型物件的指標
double dp,*dp2; // dp2是指向 double型物件的指標,dp是double 型物件
因為引用不是物件,沒有實際地址,所以不能定義指向引用的指標。
指標值
指標的值(即地址)應屬下列4種狀態之一:
- 指向一個物件。
- 指向緊鄰物件所佔空間的下一個位置。
- 空指標,意味著指標沒有指向任何物件。
- 無效指標,也就是上述情況之外的其他值。
試圖複製或以其他方式訪問無效指標的值都將引發錯誤。編譯器並不負責檢查此類錯誤,這一點和試圖使用未經初始化的變數是一樣的。訪問無效指標的後果無法預計,因此程式設計師必須清楚任意給定的指標是否有效。
儘管第2種和第3種形式的指標是有效的,但其使用同樣受到限制。顯然這些指標沒有指向任何具體物件,所以試圖訪問此類指標(假定的)物件的行為不被允許。如果這樣做了,後果也無法預計。
空指標
一下都是空指標。
int *pl = nullptr; //等價於int *pl =0;
int *p2 = 0; //直接將 p2初始化為字面常量 0
//需要首先#include cstdlib
int *p3=NULL; //等價於int *p3 =0;
建議初始化所有的指標,並且在可能的情況下,儘量等定義了物件之後再定義指向它的指標。如果實在不清楚指標應該指向何處,就把它初始化為 nullptr 或者 0, 這樣程式就能檢測並知道它沒有指向任何具體的物件了。
指標操作
如果指標的值是0(nulptr),條件取false。任何非0(nulptr)指標對應的條件值都是 true。
指標相等(==)的情況,兩個指標存放的地址值相同(兩個指標相等)有三種可能:
- 它們都為空
- 都指向同一個物件
- 或者都指向了同一個物件的下一地址。
需要注意的是,一個指標指向某物件,同時另一個指標指向另外物件的下一地址,此時也有可能出現這兩個指標值相同的情況,即指標相等。 // 另外一個指標的下一個物件,剛好指向同一個物件。
void *
void*指標能做的事兒比較有限:**拿它和別的指標比較、作為函式的輸入或輸出,或者賦給另外一個 void*
指標 **。
不能直接操作 void*
指標所指的物件,因為我們並不知道這個物件到底是什麼型別,也就無法確定能在這個物件上做哪些操作。
《C++ Primer》 P50