指標的含義
指標是「指向」另外一種型別的復合型別。與引用類似,指標也實現了對其他物件的間接訪問。
指標和引用的區別
(1)指標是乙個物件,允許對指標賦值和拷貝,而且指標在其生命週期內可以先後指向幾個不同的物件;
(2)指標無需在定義時賦初值。和其他內建型別一樣,在塊作用域內定義的指標如果沒有進行初始化操作,系統也將會自動分配乙個不確定的值。
指標的定義
定義指標型別的方法將宣告符寫成*d的形式,其中d是變數名,定義如下所示:
int
*ip1,*ip2; //ip1和ip2都是指向int 型物件的指標
double *dp1,*dp2;//dp1和dp2都是指向double 型物件的指標
獲取物件的位址int ival=42;
int *p=&ival;//p存放變數ival的位址
注:一般情況下,指標的型別和它所指向的物件需要嚴格匹配:
double dval;
double *pd=&dval;//正確
double *pd2=pd; //正確
int *pi=pd //錯誤,指標pi和pd的型別不匹配
pi=&dval; //錯誤
這是因為在宣告語句中指標的型別實際上被用於指定它所指向物件的型別,所以二者之間必須匹配。
特例1:
但是,我們可以令乙個指向常量的指標指向乙個非常量物件:
即定義如下:
const
double *ptr=nullptr;
double dval=3.14;
ptr=&dval;//合法,但是不能通過ptr修改dval的值,但是dval的值還是可變的。
利用指標訪問物件
如果指標指向了乙個物件,則允許使用解引用(*)來訪問該物件;
同時,需要注意,解引用操作僅僅適用於那些確實指向了某個物件的有效指標
空指標空指標不指向任何物件,在試圖使用乙個指標之前可以首選檢查它是否為空。空指標生成的方法如下:
int *p1=nullptr; //c++11新引入
int *p2=0; //直接將p2初始化為字面常量0
int *p3=null; //預處理變數
其實,第二種和第三種定義方式是一樣的,參見
注: 把int變數直接複製給指標是錯誤的操作,即使int變數的值恰好等於0也不可以:
int i= 0;
int*p=i; //錯誤:不能把int變數直接賦值給指標
void* 指標
void* 是一種特殊的指標型別,可用於存放任意物件的位址。乙個void * 指標存放了乙個位址,但是,對該位址中到底是個什麼型別的物件並未了解。
double obj=3.14,*pd=&obj;//正確
void *pv =&obj;//obj 可以使任意型別的物件
pv=pd;//pv可以存放任意型別的指標
利用void * 指標可以做的事很有限:和別的指標進行比較,作為函式的輸入或者輸出,或者賦值給另外乙個void*指標。但是我們無法直接操作void* 指標所指的物件,因為不知道該變數是什麼型別,不知道可以進行哪些操作。
指標和const
const 和指標結合,會有什麼樣的火花呢?
const int
*p;//
*p在const右側,所以*p不可變,但是p可變
int const *p;//
*p在const右側,所以*p不可變,但是p可變
int*const p;//p在const右側,所以p不可變,但是*p可變
const int
*const p;//p在const右側,所以p不可變,*p在const 右側,所以*p不可變
檢視以下**:
const
double pi=3.14;
double *ptr=π//錯誤,ptr是乙個普通指標,如果合法,則可以隨意修改pi的值,但是pi 定義為常量不可更改,所以相互矛盾,出現錯誤
const
double *cptr=π//正確:cptr可以指向乙個雙精度常量
*cptr=42;//錯誤,在上面的定義中,*cptr在const 的右側不可變,所以不可以賦值
c primer plus復合型別之指標
指標是乙個變數,其儲存的是值的位址,而不是值本身。了解 在討論指標之前,我們先看一看如何找到常規變數的位址,只需對變數應用位址運算子 就可以獲得他的位置,例如 int cups 6 double donuts 4.5 cout cups value 程式輸出 cups value 6 and cup...
c primer plus復合型別之指標2
使用new建立動態結構 在執行時建立陣列優於在編譯時建立陣列,對於結構亦如此。可以在程式執行時為結構分配所需要的空間,通過使用new運算子實現。建立步驟分兩步進行 1 建立動態結構 需要同時使用結構型別和new運算子。例如,建立乙個未命名的inflatable型別,將其賦值給指標,inflatabl...
2 3復合型別 指標
指標是 指向 另外一種型別的復合型別。與引用類似,指標也實現了對其他物件的間接訪問。但兩者有很多不同 1.指標本身是乙個物件,允許對指標複製和拷貝,而且在指標的生命週期內它可以先後指向幾個不同的物件 2.指標無須在定義時賦初值和其他內建型別一樣,在塊作用域內定義的指標如果沒有初始化,也將有乙個不確定...