困惑的C指针行为

时间:2015-08-17 16:41:46

标签: c arrays pointers arguments

#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++,它就可以正常工作。

谢谢,

3 个答案:

答案 0 :(得分:3)

Postfix ++不能拥有数组类型的操作数。 a函数中main的类型为char *[3],即 数组指向char 的函数printa它的类型为char **

作为功能参数

char *a[]  

相当于

char **a  

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

但是在main中,你不能修改 a 作为数组的基本位置。否则你会得到 I-Value 错误。