下面的C程序将输出作为b
,但由于Array name静默地"衰变";变成一个常量指针,那么为什么下面的程序工作,它应该给出一个错误,说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++;
^~
在代码中
void f(char a[]){
a++;
printf("%c",*a);
}
a
不是一个数组,而是一个指针。在函数参数声明的上下文中,T a[N]
和T a[]
是"0";调整后的";到T *a
——三者都将a
声明为指向T
的指针,而不是T
的数组。
当您使用数组参数调用f
时:
f(a);
表达式CCD_;腐朽的";从类型";CCD_ 11"的10元素阵列;至";指向CCD_ 12的指针";,所以f
实际接收的是指针,而不是数组对象。这完全等同于编写
f( &a[0] );
在代码中
void check(){
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
// f(a);
a++;
printf("%c",*a);
}
a
是数组表达式,而不是指针,并且数组类型的表达式不能是++
的操作数。