遍历指向字符串的指针数组 - “需要作为增量操作数的左值”

Posted

技术标签:

【中文标题】遍历指向字符串的指针数组 - “需要作为增量操作数的左值”【英文标题】:Stepping through an array of pointers to strings - "lvalue required as increment operand" 【发布时间】:2015-10-22 04:38:49 【问题描述】:

我对我将在此处说明的这个程序感到困惑。 我编写了两个简单的程序来打印字符串列表。首先,我创建了一个指向字符串的指针数组。这就是我尝试的方式

#include <stdio.h>

int main()

    int i = 2;
    char *a[] = "Hello", "World";

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

    return 0;


我需要它来打印

Hello
World

但是有编译错误,它说,

lvalue required as increment operand.

然后我把程序改成如下

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


然后它按预期工作。

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

【问题讨论】:

【参考方案1】:
*a++

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

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

【讨论】:

这里有两条规则。首先,在大多数但不是所有上下文中,数组类型的表达式被隐式转换为指向数组初始元素的指针;这就是在电话printout(a,i)a 发生的事情。其次,数组类型的函数参数被调整为指针类型,所以参数声明char *a[]真正的意思是char **amain 中的 a 是一个数组对象。 printout()中的参数a是一个指针对象。

以上是关于遍历指向字符串的指针数组 - “需要作为增量操作数的左值”的主要内容,如果未能解决你的问题,请参考以下文章

指针究竟是如何遍历字符串/数组的?

指向动态二维字符数组的三重指针的内存分配

玩转双指针

PHP------数组的遍历

C 语言二级指针作为输入 ( 指针数组 | 复杂指针解读 )

Part6 数组指针与字符串 6.6指针与数组