5

重複の可能性:
C 配列では、なぜこれが正しいのですか? [5] == 5[a]

私はCのチュートリアルを読んでいて、この構文に出くわしました:

int doses[] = {1, 3, 2, 1000};
doses[3] == *(doses + 3) == *(3 + doses) == 3[doses]

ここでのポイントは を取得することint 1000ですが、最後のものは意味がありません。遅くて私の脳が機能していないか、Cに特有のものか、タイプミスのいずれかです。ポインターに関しては、すべての基本をカバーしたいので、注意深く読んでください。それはすべてを理解することを意味します。どんな答えでも大歓迎です!

4

3 に答える 3

7

ウィキペディアより

式 a[i] は *(a+i) と意味的に同等であり、これは *(i+a) と同等であるため、式は i[a] と書くこともできますが、この形式はめったに使用されません。

于 2012-12-02T09:37:03.970 に答える
2

はい、C では配列の添え字は交換可能です。e1[e2]実際、 は と同じ*((e1)+(e2))です。しかし、本番コードでは役に立たず、この表記の唯一の目的は難読化されたソース コードを作成することです。

于 2012-12-02T09:39:54.960 に答える
0
ISO c99 : 6.5.2.1 Array subscripting

1式の 1
つは型「オブジェクト型へのポインター」を持ち、もう 1 つの式は整数型を持ち、結果は型「型」を持ちます。

E1[E2] either E1 will be pointer to object type and E2 will be integer type.

または、

E1 is integer type and E2 is of pointer to that type

as+は可換 so ですE1[E2] == E2[E1]。実際には次のように評価されるためです。(*(E1+E2))

于 2012-12-02T09:38:53.397 に答える