c语言 - 如果我使用指针表示法声明了 2D 数组的元素,为什么我无法访问它?



下面是两个二维数组 - 其中一个使用数组表示法声明,另一个使用指针表示法,(即,指向一组连续的一维数组(不是指针数组(的指针。

int array1[][3]={{1,2,3},{4,5,6}};
int (*array2)[3]={{1,2,3},{4,5,6}};

我能够使用数组和指针符号访问 array1 的元素。

//accessing the 3rd element of the first row (of array1)
printf("array1[0][2]=%d",array1[0][2]);//3
printf("n*(*array1+2)=%d",*(*array1+2));//3 

但是,当我尝试访问 array2 的相同内容时,它会生成运行时错误。

//accessing the 3rd element of the first row (of array2)    
printf("n*(*array2+2)=%d",*(*array2+2));
printf("narray2[0][2]=%d",array2[0][2]);

我声明这些数组的方式有问题吗?我也尝试将 array2 声明为静态,但它仍然生成错误。

为什么在使用指针表示法声明时会发生此错误? 我该如何纠正它?

但是,如果按如下方式替换最后 2 行,则没有错误:

printf("n(*array2+2)=%d",(*array2+2));//9
printf("narray2[2]=%d",array2[2]);//25

但这意味着什么?如果我给array2[3],那么值会增加 4(int 的大小(

此代码是非法的,因为标量的初始值设定项必须是单个表达式(可选地括在大括号中(:

int (*array2)[3]={{1,2,3},{4,5,6}};

应会收到编译器诊断消息。如果没有,请调整编译器设置。

您从任何生成的可执行文件中获得的行为都是没有意义的,因为这不是一个正确的 C 程序,因此问题的其余部分没有实际意义。

在 C u 中无法使用这种方法生成数组。

要生成固定大小的数组,您必须 int array[2][2] = {{1,2},{3,4}};

有了它,您可以将指针指向它并根据需要访问它;

void* p = (void*(array;

printf("%i",((int(p + 3((;//4