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);
}