C++ 指標

double64發表於2024-09-12

宣告

int *ipl,*ip2;  // ipl和 ip2 都是指向 int 型物件的指標
double dp,*dp2; // dp2是指向 double型物件的指標,dp是double 型物件

因為引用不是物件,沒有實際地址,所以不能定義指向引用的指標。

指標值

指標的值(即地址)應屬下列4種狀態之一:

  1. 指向一個物件。
  2. 指向緊鄰物件所佔空間的下一個位置。
  3. 空指標,意味著指標沒有指向任何物件。
  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。

指標相等(==)的情況,兩個指標存放的地址值相同(兩個指標相等)有三種可能:

  1. 它們都為空
  2. 都指向同一個物件
  3. 或者都指向了同一個物件的下一地址。

需要注意的是,一個指標指向某物件,同時另一個指標指向另外物件的下一地址,此時也有可能出現這兩個指標值相同的情況,即指標相等。 // 另外一個指標的下一個物件,剛好指向同一個物件。

void *

void*指標能做的事兒比較有限:**拿它和別的指標比較、作為函式的輸入或輸出,或者賦給另外一個 void* 指標 **。

不能直接操作 void* 指標所指的物件,因為我們並不知道這個物件到底是什麼型別,也就無法確定能在這個物件上做哪些操作。




《C++ Primer》 P50

相關文章