void input(int (*a)[3]){
int i, j;
for(i = 0; i < 3; i++){
a += i;
for(j = 0; j < 3; j++)
scanf("%d",*a+j);
}
}
void print_matrix(int (*a)[3]){
int i, j;
for(i = 0; i < 3; i++){
a += i;
for(j = 0; j < 3; j++)
printf("%d ",*(*a+j));
printf("\n");
}
putchar('\n');
}
int main(){
int matrix[3][3];
input(matrix);
printf("Printing matrix using function: \n");
print_matrix(matrix);
int i, j;
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++)
printf("%d ", matrix[i][j]);
printf("\n");
}
return 0;
}
如果我输入这样的矩阵:
1 1 1
2 2 2
3 3 3
使用功能打印矩阵可产生正确的输出:1 1 1 2 2 2 3 3 3.
但是使用两个循环打印矩阵会产生如下输出:
1 1 1
2 2 2
-5555 0 -22222
所以我显然有一些错误,但我无法弄清楚在哪里。这里我不明白为什么这对于矩阵中的第三行不起作用。
注意:我知道这可以在不使用指针和函数的情况下完成,但这不是重点,我想完全像这样做,只是无法弄清楚我做了什么错。
答案 0 :(得分:4)
在a += i;
和a += 1;
两个函数中将void input(int (*a)[3])
替换为void print_matrix(int (*a)[3])
。
原因是当我2岁时它走出界限。你正在加2。
此外,在第二个for循环后移动a += 1
。
答案 1 :(得分:2)
问题在于你如何操纵a
和input
中的print_matrix
。
在input
:
a += i; // problem is here
for(j = 0; j < 3; j++)
scanf("%d",*a+j);
在第一次迭代中,a
很好,因为添加了0。它在第二行也很好,因为添加了1以将其移动到下一行。但是在第三个方面,它增加2,将其移出矩阵的边界。
您可以简单地将a += i
替换为a++
,但如果您这样做,那么您将从应该的位置开始向下写一行。
将a += i
替换为a++
的示例输出:
[dbush] /tmp/x1
1 1 1
2 2 2
3 3 3
Printing matrix using function:
1 1 1
2 2 2
3 3 3
0 0 -668873792
1 1 1
2 2 2
要使其正常工作,请将a++
移至外部for
循环的底部。
在input
:
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++)
scanf("%d",*a+j);
a++;
}
在print_matrix
:
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++)
printf("%d ",*(*a+j));
printf("\n");
a++;
}