C改变变量和数组值

C changing variable and array value

一开始代码 a[0] 变为 31,但在第二个代码中 a 仍然是 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;
}

而且任何一本体面的书都应该提到函数的参数是按值传递的,这意味着调用中的值是复制到局部函数参数变量。

修改这个局部变量只会修改本地副本,不会修改函数调用中使用的值。

可以通过模拟 按引用传递 来克服这个问题,这是通过传递指向变量的指针来完成的:

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
}

这确实是您展示的第一个程序中发生的事情,您传递一个指针,并修改指针指向的位置的值(尽管是零大小的数组)。


您的主要困惑之一似乎是关于您的 "array" 论点。

当您将函数声明为

void f(int a[]);

你实际上并没有声明一个数组参数:编译器会将其视为一个指针并将其解析为

void f(int *a);

还有一点就是当你使用数组索引时,比如

x[i] += x[i];

你实际上是在取消引用指针,并将值写入指针指向的内存。事实上,对于任何指针或数组 x 和索引 i,表达式 x[i] 正好等于 *(x + i).