2010/11/1
關鍵字:指針
指針的聲明、定義和初始化
理解指針聲明語句時需要從右向左閱讀.
char *p1, p2;
p2爲char型變量,p1爲char型指針.
一個有效的指針必須是以下三種狀態之一:
1. 保存一個特定對象的地址.
2. 指向某個對象後面的另一個對象.
3. 0值.
一定要避免使用未初始化的指針.必須在聲明指針時就將其初始化.
C++語言無法檢測指針是否未被初始化,也無法區分有效地址和由指針分配到存儲空間中存放的二進制位形成的地址.除非指針指向某一存在的對象,最好初始化爲0,因爲編譯器可以檢測到0值指針.
對指針賦值或初始化時必須使用下面4種類型的值:
1. 0值常量表達式.
2. 類型匹配的對象的地址.
3. 另一對象之後的下一地址.
4. 同類型的另一個有效指針.
int i = 0;
char *p1 = i; //編譯錯誤,雖然p1可以初始化爲0,但i的值需要在運
//行時才知道.編譯時編譯器檢測p1和i的類型不相同
//不能初始化,所以報編譯錯誤
const int j = 0; //常量表達式
char *p2 = j; //正確,可以將指針初始化爲值常量表達式
char *p3 = j+1; //錯誤,雖然j+1也是常量表達式,但不能將指針初始化爲非0常量表達式
char *p4 = j+0; //正確,j+0計算結果是值爲的常量表達式
指針和引用的比較
1. 引用總是指向某個對象.定義引用時沒有初始化是錯誤的.指針總是指向某個地址,指針可以不用初始化,雖然是不被推薦的.
2. 給引用賦值是更改所指向對象的值,給指針賦值是更改指針指向的地址.引用一旦初始化就始終指向某個對象.
指針作爲數組的迭代器
只要兩個指針指向同一數組或有一個指向該數組末端的下一個單元,C++還支持對這兩個指針做減法操作,兩個指針的減法操作結果是標準庫類型ptrdiff_t類型的數據.和size_t一樣,也是一種機器相關的類型,在cstddef頭文件中定義,size_t是unsigned類型,ptrdiff_t是signed類型.
const size_t arrsize = 5;
int array[arrsize] = {0, 1, 2, 3, 4};
ptrdiff_t dis = array - &array[arrsize]; //dis結果是-5
C++允許計算數組或對象的超出末端的地址,單不允許對該地址進行解引用操作.而計算數組超出末端位置之後和首地址之前的地址都是不合法的.
與vector相同,數組的超出末端地址可以用做哨兵,用於檢測是否到達數組末尾.
const size_t arrsize = 5;
int array[arrsize] = {0, 1, 2, 3, 4};
for(int *pBegin = array, int *pEnd = array+arrsize; pBegin != pEnd; ++ pBegin)
//do something
更一般的寫法是
for (int i=0; i<arrsize; ++i)
//do something