读书人

关于指针数组的一个小小的疑问,该怎么

发布时间: 2012-04-25 19:32:32 作者: rapoo

关于指针数组的一个小小的疑问
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]的起始地址.
[解决办法]

探讨

引用:
a是数组a的起始地址. 当然,在这里和 a[0]的值一样.
但是作为一个指针,它们的类型不一样.
a表示的是数组a的起始地址.*a则表示是 数组a[0]的起始地址.

那*p为什么要指向a[0]的起始地址而不是a的起始地址呢?

[解决办法]
你是对2维数组 到底 首地址代表的是行 还是列没有区分清楚

a[3[3]

*a,a[n]+n,这些都是代表的几行几列,从循环可以看出,楼主想要用一个循环输出9个元素,很明显应该用p=*a,这样p指向的就是a[0][0],由于数组的地址是连续的,所以一直输出到最后一个元素,下一个元素为a[0][1]......

a,a+n,&a[N],是代表的行,p=a,p指向的是a[0][0]下一个元素就是a[1][0]


[解决办法]
C/C++ code
#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;

读书人网 >C语言

热点推荐