多級指針

多級指針

指針變數pp所指的變數Ip也是一種指針時,pp是一種指向指針的指針,稱指針變數pp是一種多級指針。(以常用的二級指針為例)

二級指針類型實際上是(一級)指針變數的地址。

定義和變數定義


設有基類型為int的指針變數p定義如下:
int *p,n;
變數p的類型為int*,指針變數p可存貯一個int類型變數(例如n)的地址:
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
{ }
(2)通過二級指針類型的參數,向外傳遞一個指針類型的結果。
函數通過參數向外傳遞一個T類型的計算結果時,該參數的類型應為
T*的。當類型T是某種指針類型時,該參數的類型則應是二級指針類型的。
(3)向函數傳遞一個列數固定的二維數組

學習要點


理解多級指針的概念,掌握多級指針變數定義的方法。
理解並能使用多級指針數組進行數據處理。

參考例子


如果指針變數中保存的是另一個指針變數的地址,這樣的指針變數稱多級指針。如果對一級指;針熟練掌握其基本原理,分析多級指針變數所表示的含義也就不困難了。例如:
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
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] <
運行結果:
a[0][0]=2
a[0][1]=4
a[0][2]=6
a[1][0]=8
a[1][1]=10
a[0][2]=12
  • 目錄