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

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

4

2 回答 2

2

引用C11,第 6.5.2.4 章,后缀递增和递减运算符

后缀递增或递减运算符的操作数应具有原子、合格或非合格实数或指针类型,并且应是可修改的左值。

可修改左值的定义在同一标准的第6.3.2.1章中给出,左值、数组和函数指示符

左值是一个表达式(对象类型不是 void),它可能指定一个对象;[...]可修改的左值是没有数组类型、没有不完整类型、没有 const 限定类型的左值,如果它是结构或联合,则没有任何成员(包括递归,所有包含的聚合或联合的任何成员或元素)具有 const 限定类型。

因此,您不能++在数组上使用。简单的。

于 2015-12-18T13:14:40.137 回答
0

因为 C 不允许分配给数组。表达式中的数组会自动转换为指向数组第一个元素的指针,除非它们用于sizeof操作或一元&(地址)运算符的操作数。(N1256 6.3.2.1)

如错误消息所示,操作数arr被转换为指向数组第一个元素的指针,并且指针不是左值,因此无法通过增量运算符对其进行修改。

于 2015-12-18T13:12:32.007 回答