C++ 二维数组与指针的关系
时间:2010-09-01 来源:kanong
很多人都以为二维数组名是一个二维指针,如下
char a[2][2];
char **p =a; //这行语句不能通过编译
其实上述的做法错误的关键在于数组名的类型不是二维指针,在具体的介绍二维数组名的本质之前,我们先看看下面的代码:
char a[2][2]={{'1','2'},{'3','4'}};
cout<<(unsigned int)(a)<<endl; //输出为1244996
cout<<(unsigned int)(a+1)<<endl; //输出为1244998 加了2个字节
cout<<(unsigned int)(*a+1)<<endl; //输出为1244997 加了1个字节
cout<<(unsigned int)(&a+1)<<endl; //输出为1245000 加了4个字节
出现上述结果的原因在于,指针在进行加减法的时候与指针的类型有很大的关系,如果p是(int *)类型的话 , p+1会在p的地址的基础上加4 , 而如果是(char *)的话,p+1会在p的地址的基础上加1。
这样就可以解释上面的结果了:
a的类型是char (*)[2]; 也就是指向数组大小为2的数组指针 , 所有a+1当然是在a的基础上加2了
*a的类型是char *; 也就是字符指针 所有*a+1当然是在a的基础上加1了
&a的类型是char (*)[2][2] 也就是指向二维数组的指针了 所有&a+1当然是在a的基础上加4了
至于C++为什么要这样处理 , 我建议看看谭浩强C语言书里面关于数组与指针关系的那部分,他用排队来描述这样做的原因,我觉的很形象。