为什么在下面的函数中增加数组"a"不是错误?

Sub*_*ksh 6 c arrays pointers function

#include<stdio.h>
void printd(char []);
int main(void){
       char a[100];
       a[0]='a';a[1]='b';a[2]='c';a[4]='d';
       printd(a);
       return 0;
}
void printd(char a[]){
        a++;
        printf("%c",*a);
        a++;
        printf("%c",*a);
}
Run Code Online (Sandbox Code Playgroud)

说明:我原以为会导致左值错误.但它正在处理任何错误并将bc作为输出.为什么这个递增数组"a"不是错误?

alk*_*alk 5

如果将数组传递给函数,它将衰减为指向数组第一个元素的指针.

由于这种内部printd()指针a可以递增和递减,以指向所述阵列的不同元件a中定义main().

请注意,在为任何类型声明/定义函数的参数列表时,T表达式T[]是等效的T*.

问题的具体情况

void printd(char a[]);
Run Code Online (Sandbox Code Playgroud)

是相同的

void printd(char * a);
Run Code Online (Sandbox Code Playgroud)

下面的代码显示了相当的行为作为OP的代码,并pa表现得就像a在侧printd():

#include <stdio.h>

int main(void)
{
   char a[100];
   a[0]='a';a[1]='b';a[2]='c';a[4]='d';

   {
     char * pa = a;

     pa++;
     printf("%c", *pa);
     pa++;
     printf("%c", *pa);
   }

   return 0;
`}
Run Code Online (Sandbox Code Playgroud)