为什么这不会改变数组中的值?

时间:2016-02-17 14:10:36

标签: c

我知道在C中,事物是通过值传递的,但我认为数组,如果在函数中修改(不进行复制)将会修改原始数据,但是当我运行此代码时不会发生。我假设范围因为范围而没有改变len?

有人可以解释一下吗?

static void task(int *b, int range){
  b[range-1] = 200;
  range = 0;
  b = NULL;
}

int main (){
  int a[]= {2,4,6};
  int len = 3, i;
  printf("len1:  %d\n", len);

  task(a,len);
  printf("len %d\n", len);
  for(i=0; i < len; i++){
    printf("%d\n", a[i]);
  }

  return 0;
}

2 个答案:

答案 0 :(得分:0)

使用指针时,可以修改指针指向的内容,但不能修改指针本身。 因此,您的函数将修改a,有效地将200放在最后位置,但是,它不会变为NULL。 Len也不会被修改。 要修改它们,你应该

void task(int **b, int *range) {
    *(b)[*range - 1] = 200;
    *range = 0;
    *b = NULL;
}

并将其命名为

task(&b, &len);

但是如果你以后要将它设置为NULL,你为什么要修改数组呢?

答案 1 :(得分:0)

声明数组int a[]= {2,4,6};时会发生的事情是值2,4,6将存储在三个连续内存字段的内存中。在变量a中,将地址存储到第一个存储器字段(保存第一个数组元素的位置)。

调用task(a,len);时,您传递了此地址的副本(按值调用)。 因此,您可以在被调用函数中输入数组,但不能覆盖实际变量a

b[range-1] = 200;使用200覆盖第三个元素会发生什么。 range = 0;b = NULL;仅覆盖仅存在于函数中的局部变量。至少两条指令不会影响main()中的变量。

返回main() a时,len的值仍然与调用task(a,len);之前的值相同。但是存储在数组中的值现在是a={2,4,200};