铸造2D阵列以双指针的失败
问题描述:
初始化的2D阵列矩阵如下:铸造2D阵列以双指针的失败
for(i=0; i<N; ++i)
{
for(j=0; j<N; ++j)
printf("%d ", *(*(matrix + i) + j));
printf("\n");
}
然而下面的代码失败:
#define N 3
...
int matrix[N][N] = {};
的矩阵的元素可以如下访问一个分段错误。
int **matrix_pointer = (int **)matrix;
for(i=0; i<N; ++i)
{
for(j=0; j<N; ++j)
printf("%d ", *(*(matrix_pointer + i) + j));
printf("\n");
}
请解释为什么或建议有效的替代方法(带指针)。
答
如果定义
int matrix[3][5];
添加然后把刚刚matrix
到=
- 运算符的右侧,排列matrix
衰减(因为每个阵列会做),以它的地址的第1个要素。
matrix
的第一个元素是int[5]
。 int[5]
的地址是int(*)[5]
。
要当“把刚刚matrix
到的=
- 运算符正确的”,那么这种赋值操作的左边是希望成为一个int(*)[5]
:
int (*row)[5] = matrix;
了解它上面很明显,做
int ** ppi = matrix
不能正确为int **
与int(*)[5]
不一样。
它从另一个不同的指针指向一个指针,会说不兼容的类型。编译器会警告这一点。
对右侧表达式应用转换以适合左侧,只是告诉编译器关闭。
[A“2d数组”与指向指针的指针不同)(https://*.com/a/18440456/440558) –
在C中投射大多数不是成功的方式,而只是沉默编译器。 – alk
因为它应该。数组不是指针,反之亦然。不要试图解决类型系统问题。 – StoryTeller