我在以下程序中的" 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 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
的答案。
答案 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