C更改变量和数组值

问题描述 投票:-2回答:1

[第一个代码a [0]变为31,而第二个代码仍为55。有人可以解释一下我的区别吗?在函数中更改变量和数组的值有什么区别?

#include <stdio.h>

int h(int x[]);

int main()
{
    printf("Hello, World!\n");
    int a[0] = 55;
    h(a);
    printf("%d", a[0]);
    return 0;
}

int h(int x[]) {
   x[0] = 31; 
}
    #include <stdio.h>

int h(int x);

int main()
{
    printf("Hello, World!\n");
    int a= 55;
    h(a);
    printf("%d", a);
    return 0;
}

int h(int x) {
   x = 31; 
}

然后这段代码呢?此数组已更改。我真的很困惑。

#include <stdio.h>

int h(int x[], int length);

int main()
{
    int i;
    int a[]= {5, 5, 5, 5};
    h(a, 4);
    printf("Array After Function Call\n");
    for(i = 0; i < 4; i++) {
       printf("%d ", a[i]);
   }
    return 0;
}

int h(int x[], int length) {
   int i;
   for(i = 0; i < length; i++) {
       x[i] += x[i];
   }
   printf("Array in Function\n");
    for(i = 0; i < length; i++) {
       printf("%d ", x[i]);
   }
   printf("\n");
   return 0;
}
c variables scope
1个回答
0
投票

而且任何体面的书都应该提到函数的参数是通过[[by value传递的,这意味着调用中的值copied传递到了本地函数参数变量中。

修改此本地变量将仅修改本地副本,而不修改函数调用中使用的值。

可以通过模拟

通过引用传递

来克服此问题,这是通过将指针传递给变量来完成的:void f(int *x) { *x = 123; // Dereference the pointer, to set the value of where it's pointing } int main(void) { int a = 0; f(&a); // Pass a pointer to the variable a }
这实际上是在您显示的第一个程序中发生的事情,传递了一个指针,并修改了指针所指向的位置的值(尽管大小为零的数组)。


似乎您的主要困惑之一是关于“数组”参数的问题。

当您声明一个函数为]时>

void f(int a[]);

您实际上没有声明数组参数:编译器会将其视为

pointer

并将其解析为
void f(int *a);
© www.soinside.com 2019 - 2024. All rights reserved.