单步执行指向字符串的指针 - "需要左值作为增量操作数"

0xE*_*D1E 4 c arrays lvalue

我对这个程序很困惑,我将在这里说明.我写了两个简单的程序来打印字符串列表.首先,我创建了一个指向字符串的指针数组.这就是我尝试这样做的方式

#include <stdio.h>

int main()
{
    int i = 2;
    char *a[] = {"Hello", "World"};

    while (--i >= 0) {
        printf("%s\n", *a++); // error is here.
    }

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

我需要它打印

Hello
World
Run Code Online (Sandbox Code Playgroud)

但有编译错误,它说,

lvalue required as increment operand.
Run Code Online (Sandbox Code Playgroud)

然后我将程序更改为以下内容

#include <stdio.h>

void printout(char *a[], int n)
{
    while (n-- > 0)
        printf("%s\n", *a++);
}

int main()
{
    int i = 2;
    char *a[] = {"Hello", "World"};

    printout(a,i);
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

然后它按预期工作.

我的问题是,当我将数组名称传递给函数时会发生什么不同?为什么它不能第一次工作(我怀疑"数组名称不能修改"是原因但是为什么在第二个程序中,它允许我增加)?

Yu *_*Hao 6

*a++
Run Code Online (Sandbox Code Playgroud)

++ 要求其操作数是可修改的左值.

在第一个示例中,a是一个数组.在第二个示例中,当作为参数传递给函数时,数组衰减为指针(指向其第一个元素),因此代码将进行编译.