如果将数组名称视为指针,为什么在递增数组时会出现Lvalue所需的编译时错误

If an array name is treated as a pointer, why do I get a compile time error of Lvalue required when incrementing an array?

本文关键字:数组 Lvalue 编译时错误 指针 如果 为什么      更新时间:2023-10-16
int main()
{
  int a[]={2,3,4,5,6};
  int j;
  for(j=0;j<5;j++)
  {
    printf("%dn",*a);
    a++; 
  }
  return;
}

给出"Lvalue必需"错误,但

int main()
{
int a[]={2,3,4,5,6};
int *p,j;
p=a;
for(j=0;j<5;j++)
{
  printf("%dn",*p);
  p++; 
 }
return;
}

没有,为什么????

虽然密切相关,但数组不是指针。数组的名称只是一个标签,用于标识某些分配的内存(因此,当您尝试修改它时会出现 Lvalue 错误(。

数组不是指针。在大多数表达式中,数组会自动转换为指针。此转换的结果不再是数组;它只是一个指针

++运算符不能仅对值进行操作。它必须有一个要对其执行操作的对象。

例如,考虑int x = 3; (x+5)++; .x+5的结果是 8。这不是x.结果只是一个值,而不是一个对象,因此没有包含 8 的对象可供++操作。这是一个错误。

类似地,如果aint数组,则a++等价于((int *) a)++++并没有试图对a采取行动;它试图根据将a转换为指针的结果进行操作。

数组表达式

始终转换为指向第一个元素的指针,除非数组表达式是 sizeof&_Alignof 的操作数,或者是用于初始化数组的字符串文本。

这将显示所有数组数据。

#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
int main()
{
    int a[]={2,3,4,5,6};
    int *p,j;
    p=a;
    for(j=0;j<5;j++)
    {
         printf("%dn",p[j]);
     }
   return 0;
}