俗話說沒有搞清楚指標就沒有學會C/C++,所以指標是一個相當重要的東東,相當年在用 C#調用C++寫的動態連結程式庫時,以為C++中的指標就是C#中的參考型別(ref),但是看了一下卻不是這樣。指標當然和記憶體是離不開的,有很多版本的定義,但是我覺得最容易理解的是:每一個變數都有一個記憶體位址,這個地址就稱為指標。
有兩個與指標有關的運算子:取地址運算子“&”(用於取一個變數的地址)和指標運算子“*”(以一個指標作為其運算元,其運算結果表示所指向的變數)。 1 #include <iostream.h>
2 void main()
3 {
4 int a, b, *pa, *pb;
5 a=10; b=20;
6 pa=&a; pb=&b; // 使pa指向a,pb指向b
7 cout<<*pa<<','<<*pb<<'\n';
8 pa=&b; pb=&a; // 使pa指向b,pb指向a
9 cout<<*pa<<','<<*pb<<'\n';
10 *pa=100; *pb=200; // 分別對b和a賦值
11 cout<<a<<','<<b<<'\n';
12 }
從上面我們可以看到聲明了兩個變數a,b類型為int,兩個指標pa,pb(指標類型為int *,指向的類型為int)。第一步&a取得為a所分配的地址即將pa指向a的地址,所以*pa=a=10,同理*pb=b=20;第二步同理可以得到*pa=b=20;*pb=a=10;第三步由於第二步將pa指向b,pb指向a所以a=*pb=200,b=*pa=100。
指標與數組關係密切,編程時可以用指標代替下標引用數組元素,指標使數組的使用更為靈活、有效。當聲明一個數組後,編譯器會按照數組的類型和長度為它分配記憶體空間,數組名表示數組在記憶體中的首地址;當用一個指標變數儲存數組首地址時,該指標就指向這個數組,就可以通過指標運算間接訪問數組的元素。指標的值是指標本身儲存的數值,這個值將被編譯器當作一個地址,而不是一個一般的數值。在32位程式裡,所有類型的指標的值都是一個32位整數,因為32位程式裡記憶體位址全都是32位長。指標所指向的記憶體區就是從指標的值所代表的那個記憶體位址開始,長度為sizeof(指標所指向的類型)的一片記憶體區。 1 #include <iostream.h>
2 void main()
3 {
4 int a[ ]={2, 4, 6, 8, 10};
5 int* pa=a; // 或pa=&a[0]
6 int result=0;
7 for(int i=0; i<5; i++)
8 {
9 result+=*pa; // 通過指標訪問數組元素
10 pa++; // 指標運算
11 }
12 cout<<"result="<<result<<'\n';
13 }
從上面我們可以看到首先我們聲明了一個數組,並付值也就是說分配其記憶體。而a表示數組在記憶體中的首地址,聲明一個指標並指向a。則pa++就是指向數組的下一個地址(int類型佔四個位元組)。