首先聲明:在C++編程時,儘可能減小數組和指針的使用。首先數組和指針容易產生不可預料的錯誤,相對也複雜和繁瑣。在程序中,不少時候數組和指針的寫法可使用Vector類型和迭代器來替代。編程
cppint *ip1; int* ip1; //兩種方式都可以定義指針,可是在連續聲明多個函數時容易出錯。 string* ip1, ip2;//ip1爲指向string類型對象的指針,ip2爲string類型的對象。 string* ip1, *ip2;//ip1和ip2同爲指向string類型對象的指針。 string *ip1,*ip2;//對比可見這種方式比較不容易產生歧義。
因爲未初始化的指針容易引起錯誤,在定義指針的時候,先定義指針所要指向的對象,若必須分開定義,給指針賦值爲0
。數組
cpp//賦給指針的地址必須是合法得到的地址,該地址所存儲的數據類型與指針類型相同 int a = 11; int *ip = &a; int *ip1 = 0;
除了基本數據類型,還有void指針,代表該指針與一地址值相關,可是不知道改地址上對象的數據類型。可是沒法對地址上的對象進行操做。函數
cppstring str="abc"; void *ip = &str;
cppint a[] = {2,4,6,8,10}; int *ip = a;//這裏的a實際上是數組a的首地址,即爲&a[0] //若是想讓指針ip指向a[4],能夠用如下兩種方式 ip = &a[4]; ip = a + 4;
下面根據上面的定義來計算兩個式子的值:
1.*(a + 4)
2.*a + 4
指針
第一個式子是a[0]地址向後移四位,獲得a[4]的地址,在用*號結引用最後獲得的結果是a[4]中的值,即爲10
。
第二個式子在a[0]處解引用,獲得a[0]中存儲的數值2,而後對2進行算術運算,最後的結果是6
。code
能夠歸結爲兩種:對象
指針能夠改變指向的地址,可是不能改變const對象的值。
定義const int *ip;
const對象只能使用指向const指針指向它,可是指向const指針也能夠指向非const對象,被指向const對象的指針所指向的對象的值不能被修改。ip
cppint a = 1; int *const ip = &a;
因爲const指針的值不能被修改,因此在定義const指針時必須初始化const指針。
修改const指針所指對象的值是容許的:string
cpp*ip = 0; cout << a << endl;//輸出0
最後放一個繞的不行的變量
cpptypedef string *pstring; const pstring cstr; //等價於 string *const cstr;