将数组传递给函数会改变其值吗?

时间:2017-02-12 17:44:14

标签: c arrays pointers

预期的结果是打印我们输入的相同值,但在第一行之后输出为零。

#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");
    }
}

2 个答案:

答案 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");
    }
}