c语言 - 数组名称不是常量指针,不能用于指针算术,那么为什么这个程序可以工作呢?



下面的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数组表达式,而不是指针,并且数组类型的表达式不能是++的操作数。

相关内容

  • 没有找到相关文章

最新更新