毫无疑问,这是毫无疑问的,但我无法理解这种行为。我初始化一个二维数组,然后调用一个函数从中打印出某些值。程序及结果如下:
int
main(void)
{
int matrix[3][5] =
{
{14,7,6,55,2},
{8,33,12,88,24},
{19,20,21,90,7}
};
printArray(3, 5, matrix);
printArray(2, 3, matrix);
return 0;
}
void
printArray(int rows, int columns, int matrix[rows][columns])
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < columns; j++)
printf("%3i ", matrix[i][j]);
printf("\n");
}
printf("\n");
}
14 7 6 55 2
8 33 12 88 24
19 20 21 90 7
14 7 6
55 2 8
似乎第二次调用printArray()时,它会继续从新行的第一行打印值,而不是实际访问下一行。我不明白这一点,因为索引值肯定是常数,不是吗?(即矩阵[1][2]应该是(在这种情况下)12,而不是8。
提前谢谢。
最佳答案
以下内容:
void printArray(int rows, int columns, int matrix[rows][columns])
向编译器保证第三个参数的维数为
rows
xcolumns
。同时,以下几行违背了这一承诺:
printArray(2, 3, matrix);
因为
matrix
是3
x5
而不是2
x3
。如果只想打印行和列的子集,可以执行以下操作:
void
printArray(int rows, int columns, int matrix[rows][columns], int max_row, int max_col)
{
int i, j;
for (i = 0; i < max_row; i++)
{
for (j = 0; j < max_col; j++)
printf("%3i ", matrix[i][j]);
printf("\n");
}
printf("\n");
}
int main(void)
{
...
printArray(3, 5, matrix, 3, 5);
printArray(3, 5, matrix, 2, 3);
}
关于c - 二维数组-为什么我没有引用预期的元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11065014/