混淆 C 指针行为

Confused C pointer behavior

#include <stdio.h>

void printa(char *a[])
{
    for (int i = 0; i < 3; ++i) {       
        printf("%s\n", *a);
        a++;
    }   
}

int main(void)
{
    char *a[] = {"The first", "The second", "The third"};

    for (int i = 0; i < 3; ++i) {
        printf("%s\n", *a); 
        a++; // error: cannot increment value of type 'char *[3]'
    }

    printa(a); //OK 

    return 0;
}

因此,我的问题是为什么main函数中的代码a++导致编译错误(错误:无法增加类型'char *[3]'的值)。但是,如果我将指针数组 a 传递给函数 printa 并在该指针上调用 a++,它会完美地工作。

谢谢,

仅仅是因为数组名称是不可修改的左值。不能在任何表达式中用作左操作数。因此,您不能将它保留在 = 表达式的左侧,或使用递增运算符

递增它

后缀 ++ 不能有数组类型的操作数。 main函数中a的类型是char *[3],即一个数组指向char 而在函数 printa 中它的类型是 char **

作为函数参数

char *a[]  

等同于

char **a  

当您调用 printa 函数时,参数现在是另一个 char ** 类型的变量。您可以增加该变量。

但是在main里面,你不能修改a作为数组的基地址。否则你会得到 I-Value 错误。