繁体   English   中英

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

[英]Passing an array to a function changes its values?

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

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

您的display例程假设2D数组是[n][n]而它是[50][50]

您必须将实际的2D数组维度与n一起传递, display例程无法知道实际的2D数组大小。

您可以像这样动态声明您的数组:

   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);

使用int *类型的参数声明函数。 您正在尝试传递int [50][50]类型的参数,该参数衰减为指针类型int (*)[50] 这些指针类型不兼容。 语言不支持从int (*)[50]int隐式转换。 您的代码不是有效的C程序,我相信您的编译器会告诉您。

一个更有意义的事情是将你的函数声明为

void display (int n, int q[n][n])

并以自然的方式访问您的数组元素

q[i][j]

但是,为此,您必须使用真正的数组大小作为n (在您的情况下为50)。 如果要处理较小的元素子矩阵,则必须单独传递其大小。

但是如果你真的想使用你的“hack”,那么在调用你的函数时你将不得不使用一个显式的强制转换

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM