Array name 不是常量指针吗,不能用在指针运算中,为什么这个程序能运行呢?

Isn't Array name a constant pointer, which can't be used in pointer arithmetic, so why does this program work?

下面的 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++;
    ^~

代码中

void f(char a[]){
  a++; 
  printf("%c",*a);
}

a 不是一个数组——它是一个指针。在函数参数声明的上下文中,T a[N]T a[] 被“调整”为 T *a - 所有三个都将 a 声明为指向 T 的指针,而不是T.

的数组

当您使用数组参数调用 f 时:

f(a);

表达式 a 从类型“int 的 10 元素数组”“退化”为“指向 int 的指针”,所以 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数组表达式,不是指针,数组类型的表达式不能作为++.[=28=的操作数]