【问题标题】:why can not we increment an array in similiar way as pointer in c? [duplicate]为什么我们不能以与 c 中的指针类似的方式递增数组? [复制]
【发布时间】:2015-12-18 13:00:15
【问题描述】:
#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)) ===

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

【问题讨论】:

  • 因为它是一个数组。答案是这样的。如果需要,它只是衰减成一个指针,但它是一种完全不同的动物。
  • 你正试图增加 arr 的 address 那里。
  • 为什么苹果尝起来不像橙子?两者都是球体,长在树上。
  • @MrLister:在函数声明的上下文中,这个int arr[] 等价于int * arr
  • @Talaria:你的意思可能是..., *(arr + 1))

标签: c arrays pointers postfix-operator


【解决方案1】:

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

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

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

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

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

【讨论】:

  • gnu.org/software/gnu-c-manual/… bold 数组下标表达式 A[i] 被定义为与表达式 (*((A)+(i))) 相同。这意味着数组名称的许多用途都等同于指针表达式。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-10
    • 2012-09-22
    • 2019-02-16
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多