混淆的C指针行为

3
#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;
}

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

A是一个数组,每个元素都是一个指向字符的指针...因此a++会失败。 - Michi
3个回答

3

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

作为函数参数

char *a[]  

等同于

char **a  

你的意思是将数组作为指针传递给函数。因此,char a[] 等同于 char *a,而 char *a[] 等同于 char **a - Linh
@Linh 是的,当它被传递到函数中时。 - ameyCU
是的,没错。当一个数组被传递到一个函数时,它的第一个元素的指针会被传递给该函数。 - haccks
如果你谈论函数参数,那么是的,但在函数内部,a[] 与 a* 不同。第一个是数组,第二个是指针。 - Michi
为什么我们不能在数组类型上使用 ++ 运算符?这是因为 a 是数组的基础,所以我们不能改变它。 - Linh
显示剩余2条评论

1
仅仅因为数组名是不可修改的左值。这意味着它不能作为任何表达式中的左操作数使用。因此,您不能将其保留在=表达式的左侧,也不能使用增量运算符对其进行递增。

1
当您调用printa函数时,参数现在是另一个类型为char **的变量。您可以递增该变量。
但是在main函数内,您不能修改a,因为它是数组的基本位置。否则,您会收到I-Value错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接