一.指針數組
一個數組的元素值為指針則是指針數組。指針數組是一組有序的指針的集合。指針數組的所有元素必須都是具有相同存儲類型和指向相同資料類型的指針變量。指針數組說明的一般形式為:
類型說明符 *數組名[數組長度] ;
其中類型說明符為指針值所指向的變量的類型。例如 int *pa[3]; 表明pa是一個指針數組,它有三個數組元素,每個元素都是一個指針,它指向int型變量。
通常可以用一個指針數組來指向一個二維數組。指針數組中的每個元素被賦予二維數組每一行的首位址,是以也可了解為指向一個一維數組。
例:
int main(int argc, char *argv[])
{
int a[3][3] = {1,2,3,4,5,6,7,8,9};
int *pa[3] = {a[0],a[1],a[2]};
int *p = a[0];
int i;
for(i=0;i<3;i++)
{
printf("%d %d %d\n",a[i][2-i], *a[i], *(*(a+i)+i));
}
//3 1 1
//5 4 5
//7 7 9
for(i=0;i<3;i++)
{
printf("%d %d %d\n",*pa[i], p[i], *(p+i));
}
//1 1 1
//4 2 2
//7 3 3
}
a[i][2-i]是數組的i行2-i列
*a[i]數數組的i行0列
*(*(a+i)+i)是數組的i行i列
*pa[i]是數組的的i行0列
p[i]是數組的0行i列
*(p+i)是數組的0行i列
應該注意指針數組和二維數組指針的差別。兩者雖然都可以用來表示二維數組,但是其表示方法和意義是不同的。
二維數組指針式單個的變量,其一般形式中”(*指針變量名)“兩邊的括号不可少。而指針數組類型表示的是多個指針,在一般形式中*指針數組名“兩邊不能有括号:
int (*p)[3]; 表示一個指向二維數組的指針變量。該二維數組的列數為3或分解為一維數組的長度為3.
int *p[3];表示是一個指針數組,p[0],p[1],p[2]均為指針變量。
指針數組也常用來表示一組字元串,這是指針數組的每個元素都被賦予一個字元的首位址。指向字元串的指針數組的初始化更為簡單。
例:
int main(int argc, char *argv[])
{
char *name[] = {"aaa","bbb","ccc"};
int i;
for(i=0;i<3;i++)
{
printf("%s ", name[i]);
}
}
二.指向指針的指針(二級指針)
如果一個指針變量存放的又是另一個指針變量的位址,則稱這個指針變量為指向指針的指針變量。
定義方式為 char **p。
例:指向指針的指針和指針數組
int main(int argc,char **argv)
{
char *name[] = {"aaa","bbb","ccc"};
int i = 0;
char **pp;
for(i=0;i<3;i++)
{
pp = name+i;
printf("%s\n",*pp);
}
}
運作結果輸出 "aaa" "bbb" "ccc"
name是一個指針數組,它的每一個元素是一個指針資料類型,其值是位址。數組名name是數組的首位址,name+i是name[i]的位址,name[i]是字元串的首位址,name+i是指向指針的指針。