指針類型
每個指針都有一個相關的類型。不同數據類型的指針之間的區別不是在指針的表示上,也不在指針所持有的值(地址) 上——對所有類型的指針這兩方面都是相同的.
不同之處在於指針所指的對象的類型上。指針的類型可以指示編譯器怎樣解釋特定地址上內存的內容 以及該內存區域應該跨越多少內存單元
通過在標識符前加一個解引用操作符 *來定義指針
int *ip1, *ip2;
complex<double> *cp;
string *pstring;
vector<int> *pvec;
double *dp;
在下面的例子中 lp 是一個指向long 類型對象的指針 而lp2 則是一個long 型的數據對象 不是指針
long *lp, lp2;
注意: // 喔: ps2不是一個字符串指針
string* ps, ps2;
當指針持有0 值時 表明它沒有指向任何對象
int ival = 1024;
// pi2被初始化爲 ival的地址
int *pi2 = &ival;
// ok: pi和 pi2現在都指向 ival
pi = pi2;
// 現在 pi2沒有指向任何對象
pi2 = 0;
指針不能被初始化或賦值爲其他類型對象的地址值 例如
double dval;
double *pd = &dval;
// 都是編譯時刻錯誤
// 無效的類型賦值 : int* <== double*
pi = pd;
pi = &dval;
當然 如果我們要做的僅僅是持有地址值 可能是把一個地址同另一個地址作比較那麼指針的實際類型就不重要了 C++提供了一種特殊的指針類型來支持這種需求空 void* 類型指針 它可以被任何數據指針類型的地址值賦值(函數指針不能賦值給它)怎麼理解?
// ok: void* 可以持有任何指針類型的地址值
void *pv = pi;
pv = pd;
void*表明相關的值是個地址,但該地址的對象類型不知道。我們不能夠操作空類型指針所指向的對象 只能傳送該地址值或將它與其他地址值作比較 已知一個int 型指針對象pi 當我們寫下pi 時
// 計算包含在 pi 內部的地址值
// 類型 int*
pi;
這將計算pi 當前持有的地址值 當我們寫下&pi 時
// 計算 pi 的實際地址
// 類型 : int**
&pi
指針的算術運算
int i, j, k;
int *pi = &i;
// i加 2 (i = i + 2)
*pi = *pi + 2;
// 加到 pi包含的地址上
pi = pi + 2; //pi指針向後移兩個單位
string 類型能夠自動將C 風格的字符串轉換成string 對象 例如 這使我們可以將一個C 風格的字符串賦給一個string 對象
string s1;
const char *pc = "a character array";
s1 = pc; // ok
但是,反向的轉換不能自動執行,對隱式地將string 對象轉換成C 風格的字符串,string 類型沒有提供支持
char *str = s1; // 編譯時刻類型錯誤
爲實現這種轉換 必須顯式地調用名爲c_str()的操作
const char *str = s1.c_str(); // ok