【发布时间】:2021-12-13 21:08:38
【问题描述】:
下面的 C 程序给我的输出为b,但是由于数组名称默默地“衰减”成一个常量指针,所以为什么下面的程序可以工作,它应该给出一个错误,说需要 l 值,即。在 LHS 上赋值需要一个变量指针?
void check(){
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
f(a);
}
void f(char a[]){
a++;
printf("%c",*a);
}
编辑:
现在我做同样的事情,但不是在不同的函数中,我在更新代码后得到错误。
void check(){
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
// f(a);
a++;
printf("%c",*a);
}
source_file.c: In function ‘check’:
source_file.c:73:4: error: lvalue required as increment operand
a++;
^~
【问题讨论】:
-
将数组传递给函数时,数组到指针的衰减正是发生的情况。声明为
char a[]的参数实际上是char *a。注意指针不是常量。 -
ainf()是一个局部变量。分配给它不会修改check()中的数组。 -
和
char *b = a;一样。你可以增加b。 -
@Barmar 正是我的观点,我们可以执行 char *b = a 然后 b++ 的原因是因为 b 不是常量指针。
-
同样的原因你可以有例如
const int a = 10; int b = a; b++;你将值复制到一个新变量中,而新变量不是常量。