为什么* list ++或*(list ++)不适用于list [4],但是对于指定了list值的指针工作正常?

时间:2013-04-28 12:14:27

标签: c operator-precedence

我在以下程序中的" lvalue required as increment operand|"语句中收到错误printf()

#include<stdio.h>

int main(void)
{
 int list[4]={12,22,32,42};

 printf("The result of *list++ is %d",*list++);

 printf("\nThe result of *(list++) is %d",*(list++));

 return 0;
 }

但是在以下程序中*myptr++*(myptr++)适用于指定myptr基址的指针listIdeone Link

#include<stdio.h>

int main(void)
{
 int list[4]={12,22,32,42},*myptr;
 myptr=list;

 printf("The result of *myptr++ is %d",*myptr++);

 myptr=list;
 printf("\nThe result of *(myptr++) is %d",*(myptr++));
 }

为什么两者之间存在差异?解释是什么?在几分钟后回答了以下问题后,我的发现中出现了这个问题。看看H2CO3的答案。

What is the difference between *myptr++ and *(myptr++) in C

4 个答案:

答案 0 :(得分:3)

变量list是一个数组,而不是指针。指针算术运算是为指针定义的,但不是为数组定义的。可以使用数组的名称来生成指针 - 例如,在myptr = list之类的表达式中,但这并不意味着数组本身可以用作指针。特别是,数组不是可修改的lvalue,这是一种说法,你不能重新分配数组本身(虽然你可以分配数组的)。

答案 1 :(得分:2)

因为指针不是数组。


您无法增加数组。试想一下,它没有意义。数组不是指针,不能将其视为一个指针。这就是为什么C标准规定它不是可修改的左值(这是你想要改变的任何东西所需要的)。

答案 2 :(得分:1)

数组不是指针。数组只是一个连续的内存。当您在表达式中提及数组的名称时,它会“衰减”到表示其起始地址的数字(指针类型)。此数字不能递增,递减或分配 - 它不是lvalue - 因为数组所在的位置不会改变。

说你有

int a[4] = { 1, 2, 3, 4};

如果以某种神奇的方式,您恰好知道该地址到底是什么 - 例如0x1000 - 您可以用((int)替换代码中{em>任何出现的a *)(0×1000))。

声明*a++=5变成了两个声明:

*a=5;
a++;
正如我们所说,

相当于:

*((int*)(0x1000))=5;
((int*)(0x1000))++;

现在,*((int*)(0x1000))=5是什么意思?这很简单:在地址0x1000处写入5。因为表达式*(指针值)左值。但((int*)(0x1000))++是什么意思?好吧,我不知道。你不能增加0x1000。

答案 3 :(得分:-1)

在大多数情况下,您可以使用int list[4]等于int * const list的简单假设。所以,它不可修改

还要记住,当你得到sizeof(list)时,这个简单的假设不起作用。例如:

int list[4];
size_t s = sizeof(list); // s = sizeof(int)*4

int * const list;
size_t s = sizeof(list); // s is equal to size of pointer