左值错误和数组指针

Posted

技术标签:

【中文标题】左值错误和数组指针【英文标题】:Lvalue errors and array pointers 【发布时间】:2018-06-03 11:05:07 【问题描述】:

代码是这样的

#include<stdio.h>
#include<stdlib.h>
int main()

 int a[]=10,20,30,40,50;
 int j;
 for(j=0;j<5;j++)
 
  printf("%d\n",*a);
  a++;
 
 return 0;

输出-

Error-:Lvalue 需要作为增量操作数

这里为什么会出现左值错误??

【问题讨论】:

因为a++是不允许的,而且无论如何也没有意义,所以错误是正确的。我的水晶球告诉我有人在某处告诉你 C 中的数组和指针是同义词。如果是这样,他们就撒谎了。 但它与左值错误有什么关系 后增量最终会做什么?它将评估后的结果存储到a,这和a = ...一样非法 【参考方案1】:

++ 的操作数必须是可修改的左值。

来自C11,第 6.5.2.4 章

后缀自增或自减运算符的操作数应具有原子性、限定性、 或不合格的实数或指针类型,并且应为可修改的左值。

数组名,不是可修改的左值。因此,它不能作为++的操作数。

添加,引用C11,章节§6.3.2.1

[...] 可修改的左值是一个左值 没有数组类型,没有不完整的类型,没有 constqualified 类型,如果它是结构或联合,则没有任何成员(包括, 递归地,所有包含的聚合或联合的任何成员或元素)具有 constqualified 输入。

【讨论】:

关于右值的任何 cmets 先生 @Arpitking 很好,标准没有定义右值。但是,它可以被认为等同于表达式的值。 标准确实在脚注中提到:"What is sometimes called 'rvalue' is in this International Standard described as the 'value of an expression'." 我也听说过任何不是左值的值都是右值。 @DavidBowling 这就是我所说的不是“定义”的意思。我在之前的评论中也提到了相同的“表达式的值”。 @SouravGhosh -- 我只是在非规范性脚注中指出标准与您一致【参考方案2】:

您不能增加数组的名称。您是否会执行以下操作,这会很好,因为您将使用指针:

int main()

 int a[]=10,20,30,40,50;
 int *b= a;
 int j;
 for(j=0;j<5;j++)
 
  printf("%d\n",*b);
  b++;
 
 return 0;

【讨论】:

【参考方案3】:

您可以使用在指针数组上添加索引值来显示数组值。

代码:

#include <stdio.h>

int main()

   int a[]=10,20,30,40,50;
 int j;
 for(j=0;j<5;j++)
 
  printf("%d\n",*(a+j));
 

 return 0;

输出:

【讨论】:

以上是关于左值错误和数组指针的主要内容,如果未能解决你的问题,请参考以下文章

《C专家编程》数组和指针并不同--多维数组

《C专家编程》数组和指针并不同--多维数组

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

表达式必须是结构指针上的可修改左值

通过指针表示法写入二维数组

深入理解指针与数组