1

我收到以下程序" 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分配了list. Ideone 链接

#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答案。

C中的*myptr++和*(myptr++)有什么区别

4

4 回答 4

3

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

于 2013-04-28T12:21:06.507 回答
2

因为指针不是数组。


你不能增加一个数组。想一想,没有任何意义。数组不是指针,它不能被视为一个。这就是为什么 C 标准要求它不是可修改的左值(任何你想要改变的东西都需要它)。

于 2013-04-28T12:16:17.873 回答
1

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

说你有

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

如果以某种神奇的方式,您碰巧确切地知道该地址将是什么 - 例如 0x1000 - 您可以用 ((int*)(0x1000)) 替换代码中的任何出现a

该语句*a++=5变成2个语句:

*a=5;
a++;

正如我们所说,这相当于:

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

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

于 2013-04-28T12:19:30.323 回答
-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
于 2013-05-17T04:10:56.920 回答