C 为什么不';这不会改变数组中的值吗?

C 为什么不';这不会改变数组中的值吗?,c,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

我知道在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;
}
静态无效任务(int*b,int范围){
b[范围-1]=200;
范围=0;
b=零;
}
int main(){
int a[]={2,4,6};
int len=3,i;
printf(“len1:%d\n”,len);
任务(a,len);
printf(“len%d\n”,len);
对于(i=0;i
使用指针时,可以修改指针指向的对象,但不能修改指针本身。 因此,您的函数将修改a,有效地将200置于最后一个位置,但是,它不会变为NULL。 Len也不会被修改。 要修改这两个选项,您应该执行以下操作

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

task(&b, &len);

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

当声明数组时会发生什么情况
inta[]={2,4,6}
表示值
2,4,6
将存储在三个连续的内存字段中。在变量
中,
将存储到第一个内存字段的地址(第一个数组元素保存在该字段中)

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

这里发生的是
b[range-1]=200
200
覆盖第三个元素<代码>范围=0
b=NULL仅重写仅存在于函数中的局部变量。至少两条指令不会影响
main()
中的变量


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

“它不会发生”?到底是什么?在调用
task()
之后,
a
包含
{2,4200}
<但是,code>range=0
b=NULL
基本上没有操作,因为您正在修改局部变量(调用参数的副本)。
len
不会更改,除非您调用
task(a,&len)
并声明
task(int*b,int*range)
。在您的示例中,
len
不会更改,因为它是通过值传递的,而不是通过引用传递的。对函数中数组的修改不会更改原始数组吗?是的,但是作为
range
传递的
len
不是数组,因此它与其他所有内容一样是通过值传递的。修改局部作用域指针参数也不会修改最初传递的指针。只有数组(有效地衰减为指针)或指针的目标才能在函数内以逃逸到外部作用域的方式进行修改。
static void task(int*b,int range){
是否允许将函数设为静态?这是一段来自测验复习的代码片段,以强调我们学到的概念,我没有写这篇文章“强调我们学到的概念"他们是不是在教你如何写无操作?他们真正的问题是什么?这就解释了为什么这么奇怪:你不能将数组设置为NULL,它不是指针。除了数组已经衰减为指针之外,没有理由使用双指针。这个例子是不正确的。如果按所示调用,参数
b
,如所示<代码>任务
不是一个
int**
。它实际上是一个
int(*)[3]
,它的值是
a
的地址。它不是一个指针数组,正如您的示例所期望的那样。