预期的结果是打印我们输入的相同值,但在第一行之后输出为零。
#include<stdio.h>
void display(int *q, int);
int main() {
int i,j,n;
int d[50][50];
printf("Input the order\t");
scanf("%d", &n);
for (i=0;i<=(n-1);i++) {
for (j=0;j<=(n-1);j++) {
scanf("%d", &d[i][j]);
}
}
display (d, n);
}
void display (int *q, int r) {
int i,j;
for (i=0;i<r;i++) {
for (j=0;j<r;j++) {
printf("%d\t", *(q + i*r + j));
}
printf("\n");
}
}
答案 0 :(得分:0)
您的display
例程假定2D数组为[n][n]
,而[50][50]
为<{1}}。
您必须将实际的二维数组维度与n
一起传递,display
例程无法知道实际的二维数组大小。
您可以像这样动态声明数组:
printf("Input the order\t");
scanf("%d", &n);
int d[n][n];
然后避免警告
test.c:20:18: warning: passing argument 1 of 'display' from incompatible pointer type
display (d, n);
这里显式地转换为1D指针(因为你知道结构):
display ((int*)d, n);
答案 1 :(得分:0)
您的函数使用int *
类型的参数声明。您正在尝试传递类型为int [50][50]
的参数,该参数将衰减为指针类型int (*)[50]
。这些指针类型不兼容。语言不支持从int (*)[50]
到int
的隐式转换。您的代码不是有效的C程序,我相信您的编译器会告诉您。
更有意义的事情是将您的函数声明为
void display (int n, int q[n][n])
以自然的方式访问您的数组元素
q[i][j]
但是,为此,您必须使用真正的数组大小n
(例如,在您的情况下为50)。如果要处理较小的元素子矩阵,则必须单独传递其大小。
但如果你真的想使用你的“黑客”,你必须在调用你的函数时使用显式的强制转换
display ((int *) d, n);
并且请记住,无论n
的值如何,原始数组的每一行仍包含50个元素,如声明的那样。这意味着在您的函数内部,您将不得不使用50作为行大小乘数
void display (int *q, int r) {
int i,j;
for (i=0;i<r;i++) {
for (j=0;j<r;j++) {
printf("%d\t", *(q + i*50 + j));
}
printf("\n");
}
}