2維數組:
1)定義形如int a[2][3],此時a代表的是這個2維數組的地址,sizeof(a)為24。
2級指針:
1)定義形如int **p:表示為指向指針的指針
2)2級指針不能和2維數組替換,如int aa[2][3],**a;a=aa;是毛病的,但可以用int (*a)[3];a=aa替換。
指針數組:
1)定義形如int *p[5]:表示含有5個指針元素的數組、又稱為2維指針,可以和p[5][n]在1定情況下通用,sizeof(p)為20。
2)每一個元素均是指針。如p[0]、p[1]均是指針。
如 char *p[5]={
“saf”,
“rfsdfds”,
“gjnaf”,
“asdfds”,
“wef”
};
p[0]~p[4]均表示字符串的地址
3)p相當于數組名是1個常量不可以更改,類似p++、p+=1均是毛病的,所以p不能作為左值。
4)指針數組和2級指針之間的替換
char *p[5]={“saf”,”rfsdfds”,”gjnaf”, “asdfds”,”wef”};
char **q;
q=p;//此時相當于將p隱式轉換了。還可以理解為p本身就是1個1維數組(1維數組的地址),只是多1個,那末就能夠用多1個的1級指針來替換。
5)指針數組作為參數
函數聲明為void fun(char *p[]),調用fun(p).
數組指針:
1)定義形如int (*a)[3].a為指向數組的指針,sizeof(a)為4。
2)數值指針可以和多維數組替換,但是多級指針不可以和多維指針替換。
如
int (*a)[3],**aa,aaa[2][3];
a=aaa;//正確
aa=a;//毛病
aa=aaa;//毛病
由于a和aaa都表示1個數組指針,而aa僅僅表示1個指針的指針。
3)作為形參
void fun(int (*a)[3])//2維下標必須要明確指出,后面編譯器計算a[i][1]的地址就相當于計算a+i*3+1.
{
int i;
for(i=0;i<2;i++)
printf(“%d”,a[i][1]);
}
int main()
{
int a[2][3]={1,2,3,4,5,6};
fun(a);
}