我知道在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;
}
答案 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};
。