在c語言中,陣列名就是乙個指標常量,儲存陣列的首位址。因為陣列名是乙個常量指標常量,不能修改其指向的值,因此可以定義乙個指標變數指向陣列。這樣使用陣列名加下標可訪問陣列中的元素,使用指標名加下標也可訪問陣列中的元素。這些在本章前面已經介紹過了。
現在如果再定義乙個二級指標變數,讓其指向一級指標,就可使用二級指標變數運算元組。例如,使用以下語句定義二級指標變數:
int a[10];這樣,二級指標變數pp、一級指標變數p和陣列a之間的關係,如圖9-47所示。int *p=
a;
int **
pp=&p;
1.用二級指標操作一維陣列
可使用以下**輸出陣列a中各元素的值:
【程式9-24】
#include在以上程式中,分別採用了如下幾種方法輸出陣列各元素的值。<
stdio.h
>
//標頭檔案
#include
<
stdlib.h
>
int main()
;//宣告並初始化
int *p,**pp;
printf("使用陣列方式輸出陣列各元素的值:\n");
for(i=
0;i<
10;i++) //使用陣列方式輸出
printf("\n使用一級指標變數輸出陣列各元素的值:\n"); p=
a;
for(i=
0;i<
10;i++) //使用一級指標變數輸出
printf("\n使用二級指標變數輸出陣列各元素的值:\n"); p=
a;
pp=&p;
for(i=
0;i<
10;i++) //用二級指標變數輸出
printf("\n使用二級指標變數**p方式輸出陣列各元素的值:\n"); p=
a;
for(i=
0;i<
10;i++,p++)//使用二級指標變數**p方式輸出
printf("\n");
system("pause");
return 0;
}
使用陣列下標方式輸出各元素的值。
使用一級指標變數輸出指向元素的值,然後執行p++使指標指向下乙個元素,迴圈處理將所有陣列元素都輸出。
使用二級指標變數的方式輸出陣列元素值,在第23行中,首先使用*pp得到一級指標變數p中儲存的值,再將其加上乙個整數i,再使用運算子*得到具體的值。
使用**pp方式輸出具體元素的值,這時,因為二級指標變數pp指向一級指標變數p,所以只需要改變一級指標變數p所指向的位置,**pp就可以得到不同元素的值。
編譯執行這段程式,得到如下結果,如圖9-48所示。
圖9-48 執行結果
從以上程式可以看出,對於一維陣列,使用一級指標變數可方便地運算元組元素,而使用二級指標變數只會讓情況更複雜。
2.用二級指標操作二維陣列
用二級指標操作二維陣列的示意圖,如圖9-49所示。同樣在二級指標變數pp中儲存一級指標的位址,修改一級指標p的指向,使用**pp就可訪問到不同的陣列元素,如圖9-49所示。因為一級指標變數定義為int型,所以對指標變數p進行自增時,將移動到下乙個int變數(即乙個陣列元素),如圖9-49右圖所示。
下面編寫程式,用二級指標變數輸出二維陣列的資料。
【程式9-25】
#include在該程式中,首先使二級指標變數pp指向一級指標變數p,因為p的記憶體位址不會再變化,所以可將該語句放在程式前面,在後面的迴圈中不需要修改其值。然後,使用*(*pp+j)的方式輸出陣列中的值,這種方式在本章前面曾多次使用,首先通過*pp得到一級指標變數p儲存的值(從語句p=a[i]可知道,變數p中儲存著二維陣列某行的首位址),再將其加上乙個整數j,得到該行第j個元素的位址,最後使用運算子*得到該位址的值。<
stdio.h
>
//標頭檔案
#include
<
stdlib.h
>
int main()
,,}; //宣告並初始化
int *p,**pp;
printf("用二級指標方式輸出二維陣列:\n");
pp=&p;
for(i=
0;i<
3;i++)//用二級指標方式輸出
printf("用二級指標**pp輸出二維陣列:\n");
for(i=
0;i<
3;i++)//用二級指標**pp輸出
printf("\n"); //輸出換行
system("pause");
return 0;
}
在第二種方法中,使用**pp方式輸出二維陣列元素的值,該表示式可看做為*(*pp),*pp得到變數p中的值,從語句p=a[i]可知道,變數p中儲存著二維陣列某行的首位址,該首位址也是該行第1個元素的位址,因此使用*(*pp)將輸出某行第1個元素的值。接著執行迴圈中的p++,使一級指標變數的值增加1,因該變數儲存的值是乙個指標,所以對其進行自增運算將指向下乙個元素,即該行的第2個元素,再使用**pp即可輸出第2個元素的值。通過內迴圈語句,即可將二維陣列一行中的每個元素輸出。再通過外迴圈,即可輸出整個二維陣列中的元素值。
編譯執行這段程式,得到如下結果,如圖9-50所示。
圖9-50 執行結果
3.用二級指標操作指標陣列
在本章的程式9-22中,使用指標陣列操作多個字串。還可以通過二級指標變數的方式進行這種操作,其示意圖如圖9-51所示。首先定義乙個字串指標陣列s,用來指向多個字串常量,再定義乙個二級指標變數p,使其指向陣列s,因陣列s中的每個元素都是陣列,因此指標變數p必須定義為指向指標的指標(即二級指標)。
修改程式9-22中的strsort()函式,使其形參使用二級指標的方式。
【程式9-26】
#include編譯執行這段程式,得到如下結果,如圖9-52所示。<
stdio.h
>
//標頭檔案
#include
<
stdlib.h
>
#include
<
string.h
>
void strsort(char **p,int n); //函式宣告
int main()
; strsort(s,sizeof(s)/4); //排序
printf("\n排序後的資料:\n");
for(i=
0;i<
sizeof
(s)/4;i++) //輸出
system("pause");
return 0;
} void strsort(char**p,int n) //自定義函式
} } }
圖9-52 執行結果
在該程式中,重新編寫自定義函式strsort()。在函式頭的形參中,使用二級指標變數p接收乙個指標變數的位址作為引數(指標陣列的每乙個元素是乙個指標,指標陣列名就是乙個指向指標變數的指標),變數n為需要處理的字串數量。
在自定義函式strsort()中,定義了乙個字元指標變數pstr,作為臨時指標變數,用來儲存需要交換的指標位址。
對照前面的示意圖,*(p+i)表示p[i],即與陣列s[i]相同,得到其指向的字串常量。程式中呼叫庫函式strcmp()比較兩個字串的大小,再根據需要交換指標。
二級指標與陣列
char str 這是字元指標陣列,每乙個陣列元素是乙個指標變數,而每個指標變數指向字串首字元位址,即是字串的位址。因為每乙個字串都代表的是乙個位址,是字串首字元的位址。字串常量是放在文字常量區,是不可以更改的。而指標陣列str裡面存放的是指向字串位址,它是可變的。如str 0 是可變的,它是指標變...
C 陣列指標 指標陣列與二級指標
二級指標 測試 陣列指標是指標,意為指向陣列的指標 指標陣列是陣列,意為陣列內部儲存著指標的陣列。陣列指標具有如下特性1 陣列指標用於指向乙個陣列 陣列名是陣列首元素的起始位址,但不是陣列的起始位址,通過取位址符 作用域陣列名可以得到陣列的起始位址 可以通過陣列型別定義陣列指標如 arraytype...
指標與二級指標
int num 10 int p1 int p2 p1 指標的指向結構如下圖所示 0x4000 0x3000 p2 0x2000 p1 num p2 表示的是儲存p2指標的位址 p2 表示的是p2指向的位址,即指標p1存放的位址 p2 表示指標p2指向位址中所存的值,即指標p1指向的位址,即變數nu...