-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

しかし、以下のように 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 以外のオブジェクト型を持つ) 式です。[...]変更可能な左辺値は、配列型を持たず、不完全な型を持たず、constqualified 型を持たず、構造体または共用体の場合、メンバーを持たない左辺値です (再帰的に含む) 、含まれるすべての集合体または共用体の任意のメンバーまたは要素) を、constqualified 型で指定します。

++したがって、配列では使用できません。単純。

于 2015-12-18T13:14:40.137 に答える
0

C では配列への代入が許可されていないためです。sizeof式内の配列は、演算または単項&(アドレス) 演算子のオペランドに使用されない限り、配列の最初の要素を指すポインターに自動的に変換されます。(N1256 6.3.2.1)

エラーメッセージが示すように、オペランドarrは配列の最初の要素を指すポインターに変換され、ポインターは左辺値ではないため、インクリメント演算子を介して変更することはできません。

于 2015-12-18T13:12:32.007 に答える