初始化2D数组矩阵,如下所示:
#define N 3
...
int matrix[N][N] = {};
可以按如下方式访问矩阵的元素:
for(i=0; i<N; ++i)
{
for(j=0; j<N; ++j)
printf("%d ", *(*(matrix + i) + j) );
printf("\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");
}
请解释为什么或建议一种有效的替代方法(带指针)。
答案 0 :(得分:0)
如果定义
int matrix[3][5];
添加然后只将matrix
放在=
- 运算符的右侧,数组matrix
衰减(就像每个数组一样)到它的第一个元素的地址。
matrix
的第一个元素是int[5]
。 int[5]
的地址为int(*)[5]
。
如果“只将matrix
放在=
- 运算符的右侧”,则此分配操作的左侧应为{{1} }:
int(*)[5]
了解上述内容显然是在做
int (*row)[5] = matrix;
无法正确,因为int ** ppi = matrix
与int **
不同。
它指向另一个不同指针的指针,会说不兼容的类型。编译器会警告这一点。
对右侧表达式应用强制转换以适合左侧,只是告诉编译器关闭。