为什么我们不能像c中的指针一样以类似的方式递增数组?

时间:2015-12-18 13:00:16

标签: c arrays pointers postfix-operator

#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)) ===

为什么我们不能以相同的方式递增数组,我们递增包含该数组地址的指针以获取下一个元素?

2 个答案:

答案 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被转换为指向数组第一个元素的指针,而指针不是左值,因此无法通过递增运算符进行修改。