作者:小月骄阳 | 来源:互联网 | 2023-09-15 13:32
#includeintmain(){intarr[]{1,2,3,4};int*p;parr;printf(%dn,*p);printf(%dn,*arr);p++;pri
#include int main(){ int arr[] = {1, 2, 3, 4}; int *p; p = arr; printf("%dn", *p); printf("%dn", *arr); p++; printf("%dn", *p); }
此代码输出:
1 1 2
但是当我们添加2行时,如下所示:
#include int main(){ int arr[] = {1, 2, 3, 4}; int *p; p = arr; printf("%dn", *p); printf("%dn", *arr); p++; printf("%dn", *p); arr++; printf("%dn", *arr); }
此代码输出:
C:UsersHasnatDesktoptest.c||In function 'main':| C:UsersHasnatDesktoptest.c|11|error: lvalue required as increment operand === Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===
为什么我们不能以相同的方式递增数组我们递增包含该数组的地址的指针以获得下一个元素?
引用C11
,第6.5.2.4章, Postfix递增和递减运算符
后缀增量或减量运算符的操作数应具有primefaces,限定或非限定的实数或指针类型, 并且应为可修改的左值。
可修改左值的定义在同一标准的第6.3.2.1节中给出, 左值,数组和函数指示符
左值是一个表达式(对象类型不是void)可能指定一个对象; […] 可修改的左值是一个左值,它没有数组类型 ,没有不完整的类型,没有constqualified类型,如果是结构或联合,则没有任何成员(包括,递归) ,具有constqualified类型的所有包含聚合或联合的任何成员或元素。
所以,你不能在数组上使用++
。 简单。
因为C不允许分配给数组。 表达式中的数组会自动转换为指向数组第一个元素的指针,除非它们用于sizeof
操作数或一元&
(地址)运算符。 (N1256 6.3.2.1)
正如错误消息所示,操作数arr
被转换为指向数组的第一个元素的指针,而指针不是左值,因此不能通过递增运算符修改它。
以上就是c/c++开发分享为什么我们不能像c中的指针那样以类似的方式递增数组?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(编程笔记)。