关于指针数组的一个小小的疑问
char a[3][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'}
};
char *p=*a; //a不是表示一个数组的开始地址么?那为什么还要取*,取完*不就是a[0]的起始地址了么?不懂啊。。
for(int i=0;i<9;i++)
{
printf("a: %c\n",*(p+i));
}
[解决办法]
a是数组a的起始地址. 当然,在这里和 a[0]的值一样.
但是作为一个指针,它们的类型不一样.
a表示的是数组a的起始地址.*a则表示是 数组a[0]的起始地址.
[解决办法]
#include <iostream>using namespace std;int main(){ char a[3][3] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'} }; char *p=*a; printf("%x\n",a[0]); printf("%x\n",a); printf("%x\n",&a[0][0]); printf("%x\n",p); return 0;}
[解决办法]
a是 二维数组的地址 类型: char (*)[3]
*a = *(a + 0) = a[0], 也就是二维数组的第一维的第一个元素a[0]的第一个元素(即a[0][0])的地址
也就是说他们2个指向同一个地址,但是类型不一样。
a+1 指向下第一维的下一个元素,也就是3个char的跳
而*a + 1指向 下一个char
这边显然需要的是 *a
不过你也可以通过类型转换来达到这个目的
char *p =(char *)a;