C 二维数组指针
这是Microsoft测试中的一个问题:C 二维数组指针,c,pointers,C,Pointers,这是Microsoft测试中的一个问题: main() { int a[2][3]= { (1,2,3),(4,5,6)}; int (*ptr)[3] = &a[0]; printf("%d %d\n", (*ptr)[1],(*ptr)[2]); ptr+=1; printf("%d %d\n", (*ptr)[1],(*ptr)[2]); } 提供的选择包括: 分段故障 编译错误
main()
{
int a[2][3]= { (1,2,3),(4,5,6)};
int (*ptr)[3] = &a[0];
printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
ptr+=1;
printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
}
提供的选择包括:
分段故障
编译错误
总线错误
运行时错误
我运行了这个代码,但没有得到任何结果。我得到了以下答案:
6 0
0 0
你能帮我理解发生了什么吗?主要问题是这一行:
int a[2][3]= { (1,2,3),(4,5,6)};
它使用括号而不是大括号。1,2,3的结果仅为3,4,5,6的结果仅为6。这相当于:
int a[2][3]= { 3,6 };
这反过来相当于
int a[2][3] = { {3,6,0}, {0,0,0} };
printf("%d %d\n", (*&a[0])[1],(*&a[0])[2]);
ptr=&a[1];
此行使ptr指向[0]:
int (*ptr)[3] = &a[0];
这条线
printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
ptr+=1;
那么相当于
int a[2][3] = { {3,6,0}, {0,0,0} };
printf("%d %d\n", (*&a[0])[1],(*&a[0])[2]);
ptr=&a[1];
可以简化为
printf("%d %d\n", (a[0])[1],(a[0])[2]);
或者只是
printf("%d %d\n", a[0][1],a[0][2]);
这条线
printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
ptr+=1;
使ptr指向a的下一个元素,因此相当于
int a[2][3] = { {3,6,0}, {0,0,0} };
printf("%d %d\n", (*&a[0])[1],(*&a[0])[2]);
ptr=&a[1];
因此,下一行简化为
printf("%d %d\n", a[1][1],a[1][2]);
该程序有效地打印了[0][1]、[0][2]、[1][1]和[1][2],因此得到了6,0,0,0
Charles Baley指出main缺少返回类型。这可能就是他们想要的。编译器通常至少会对此发出警告。您确定正确复制了文本吗
1,2,3是具有两个序列或逗号运算符的表达式;它的值是3。同样,4,5,6的值是6。这是在[0][1]处打印的6,因为ptr指向[0],您打印*ptr[1];0是一个[0][2],默认初始化为0。然后递增ptr,将其指向[1],这样就可以打印[1][1]和[1][2],默认初始化值为0。main缺少返回类型。这应该会导致编译错误,除非您使用的是非常旧或非常自由的编译器。thanx:D我没有注意itA C89编译器,就像MS Visual C没有义务抱怨main.thanx:D上缺少返回类型一样,正如charles指出的,我遗漏了返回语句。但是,你能告诉我*ptr[3]=&a[0]具体在做什么吗?它int*ptr[3]=&a[0];将ptr定义为指向3个整数数组的指针,并使用指向a中第一个3个整数数组的指针对其进行初始化。因此,如果我有一个数组,假设{1,2,3,4},{5,6,7,8},并且我有*ptr[3]=&a[0],会怎么样?ptr和ptr+1指向的数组是什么?@VaibhavAgarwal:如果您没有更改数组的类型,那么额外的值将被忽略。如果将a的类型更改为int a[2][4],则ptr的类型将不兼容。