初始化二维数组矩阵,如下所示:
#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");
}
请解释原因或建议一种有效的替代方法(带有指针)。
如果定义
int matrix[3][5];
添加然后只在 =
运算符的右侧放置 matrix
,数组matrix
衰减(就像每个数组一样)到它的第一个元素的地址。
matrix
的第一个元素是int[5]
。int[5]
的地址是 int(*)[5]
。
如果"只把matrix
放在=
运算符的右侧",那么这个赋值操作的左侧应该是int(*)[5]
:
int (*row)[5] = matrix;
了解上述内容很明显,做
int ** ppi = matrix
不能正确,因为int **
与int(*)[5]
不同。
它从另一个不同的指针分配给一个指针,会说不兼容的类型。编译器会对此发出警告。
将强制转换应用于右侧表达式以适合左侧,只是告诉编译器关闭。