#include <stdio.h>
int main(){
int arr[] = {1, 2, 3, 4};
int *p;
p = arr;
printf("%d\n", *p);
printf("%d\n", *arr);
p++;
printf("%d\n", *p);
}
此代码输出:
1
1
2
但是当我们添加如下两行时:
#include <stdio.h>
int main(){
int arr[] = {1, 2, 3, 4};
int *p;
p = arr;
printf("%d\n", *p);
printf("%d\n", *arr);
p++;
printf("%d\n", *p);
arr++;
printf("%d\n", *arr);
}
此代码输出:
C:\Users\Hasnat\Desktop\test.c||In function 'main':|
C:\Users\Hasnat\Desktop\test.c|11|error: lvalue required as increment operand
=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===
为什么我们不能以相同的方式递增数组,我们递增包含该数组地址的指针以获取下一个元素?
答案 0 :(得分:2)
引用C11
,第6.5.2.4章, Postfix递增和递减运算符
后缀增量或减量运算符的操作数应具有原子的,合格的, 或不合格的真实或指针类型,,并且应该是可修改的左值。
和可修改的左值的定义在同一标准的第6.3.2.1章中给出,左值,数组和函数指示符
左值是一个潜在的表达式(对象类型不是void) 指定一个对象; [...] 一个可修改的左值是一个左值 没有数组类型,没有不完整的类型,没有constqualified 类型,如果是结构或联合,则没有任何成员(包括, 递归地,所有包含聚合或联合的成员或元素)具有constqualified 类型。
因此,您不能在数组上使用++
。简单。
答案 1 :(得分:0)
因为C不允许分配给数组。表达式中的数组会自动转换为指向数组第一个元素的指针,除非它们用于sizeof
运算符或一元&
(地址)运算符的操作数。 (N1256 6.3.2.1)
如错误消息所示,操作数arr
被转换为指向数组第一个元素的指针,而指针不是左值,因此无法通过递增运算符进行修改。