定義和變數定義
設有基類型為int的指針變數p定義如下:
int *p,n;
變數p的類型為int*,指針變數p可存貯一個int類型變數(例如n)的地址:
p=&n; /* n的地址存貯到指針p中,即,使p指向n */
記p的類型(int*)為T,即,p是T類型的變數。
可使用基本運算(&)
&p
來計算指針變數p的地址。上面基本運算的結果是T* 類型的,即,是
T* ≡ (int*)* ≡ int**
類型的,即是基類型為int的指針變數的地址,是基類型為int的二級指針。
若要把上面的計算結果存貯到一個變數中,我們需要定義一個T*類型的
指針變數,例如q:
T *q; ≡ (int*)*q; ≡ int **q;
變數q被稱為基類型為int的二級指針變數。
下面的處理使q指向p:
q=&p;
下圖描述了int類型變數n、基類型為int的一級指針p、基類型為int的
二級指針q之間的關係:
一般地,K級指針變數的地址是K+1級指針類型的。實用上,二級指針的使用 最為廣泛,三級以上的指針很少使用。
多級指針的套用
(1) 使二級指針指向指針數組的元素,並通過二級指針指出指針數組中的元素。
設p是一個基類型為T的指針數組,q是一個基類型為T的二級指針
T *p[N],**q; (N是一個正整數常量)
語句
for(q=p,k=0;k<N;++k,++q)
{ /* *q按順序方式指出指針數組p中一個元素(基類型為T的指針)*/ }
(2)通過二級指針類型的參數,向外傳遞一個指針類型的結果。
當函式通過參數向外傳遞一個T類型的計算結果時,該參數的類型應為
T*的。當類型T是某種指針類型時,該參數的類型則應是二級指針類型的。
(3)向函式傳遞一個列數固定的二維數組。
學習要點
理解多級指針的概念,掌握多級指針變數定義的方法。
理解並能使用多級指針數組進行數據處理。
參考例子
如果指針變數中保存的是另一個指針變數的地址,這樣的指針變數稱多級指針。如果對一級指; 針熟練掌握其基本原理,分析多級指針變數所表示的含義也就不困難了。例如:
#include <iostream.h>
void main()
{
int a= 5;
int *b=&a;
int ** c = &b;
cout<< **c << endl;
**c =10;
cout <<"a=" <<"**c=" <<**c;
}
程式中c稱為多級指針(二級指針),在這個語句執行完之後,a,b,c之間的關係是:
變數c -------------> 變數b -------------> 變數a
或表示為 “ c---->*---->*--->int
即c是一個指針,該指針指向一個指向int類型變數的指針變數。
分析* c和**c的類型:
c----->*----->*------> int
* c----> * ----> int **c----->int
表達式**c引用到一個基本數據類型的變數,這是程式設計師想細緻了解的變數,而象c和*c的值, 因為它們是指針,程式設計師所關心的只是使用指針運算建立和修改它們之間的聯繫(指向……)。 在上面給出的程式中,語句
**c=10;
pa---> [2] ----> * --->int
即pa是有兩個元素的數組,每個元素是個指向int類型的指針。而pc為 :
pc---> [5] ----> [7] ---> * ---> char
例:
#include <iostream.h>
void main()
{
int a[2][3]={2,4,6,8,10,12};
int *p[2];
p[0]=a[0];
p[1]=a[1];
for(int i=0:i<2;i++)
for (int j=0;j<3; j++, p[i]++)
cout << "a[" << i << "][" << j << "]=" << *p[i] <<endl;}
運行結果:
a[0][0]=2
a[0][1]=4
a[0][2]=6
a[1][0]=8
a[1][1]=10
a[0][2]=12