【问题标题】:C changing variable and array value [closed]C改变变量和数组值[关闭]
【发布时间】:2020-06-07 10:18:51
【问题描述】:

第一个代码 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;
}

【问题讨论】:

  • int a[0] 个元素的数组。括号内的值是大小,元素个数,而不是顶部索引的值。
  • int a[0] = 55; 在标准 C 中是不允许的(不允许使用零大小的数组;数组只能由大括号括起来的列表初始化)。建议将您的编译开关更改为在标准模式下运行
  • @chux-ReinstateMonica 删除了我的评论。混淆了a[0]a[]。我将在链接的答案中添加评论。

标签: c variables scope


【解决方案1】:

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

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

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

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

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

void f(int *a);

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

x[i] += x[i];

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

【讨论】:

  • 你对最后一段代码的看法
  • 将指针传递给变量会使用“副作用”,这并不总是好的。在大多数情况下最好返回值godbolt.org/z/vUEuHV
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2018-03-09
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多