二维数组:
1)定义形如int a[2][3],此时a代表的是这个二维数组的地址,sizeof(a)为24。
二级指针:
1)定义形如int **p:表示为指向指针的指针
2)二级指针不能和二维数组替换,如int aa[2][3],**a;a=aa;是错误的,但可以用int (*a)[3];a=aa替换。
指针数组:
1)定义形如int *p[5]:表示含有五个指针元素的数组、又称为二维指针,可以和p[5][n]在一定情况下通用,sizeof(p)为20。
2)每个元素均是指针。如p[0]、p[1]均是指针。
如 char *p[5]={
“saf”,
“rfsdfds”,
“gjnaf”,
“asdfds”,
“wef”
};
p[0]~p[4]均表示字符串的地址
3)p相当于数组名是一个常量不可以更改,类似p++、p+=1均是错误的,所以p不能作为左值。
4)指针数组和二级指针之间的替换
char *p[5]={“saf”,”rfsdfds”,”gjnaf”, “asdfds”,”wef”};
char **q;
q=p;//此时相当于将p隐式转换了。还可以理解为p本身就是一个一维数组(一维数组的地址),只是多一个,那么就可以用多一个的一级指针来替换。
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都表示一个数组指针,而aa仅仅表示一个指针的指针。
3)作为形参
void fun(int (*a)[3])//二维下标必须要明确指出,后面编译器计算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);
}