書籍「スッキリわかるc言語」で学習を進めているのですが、
この書籍の10章「メモリアクセスのからくり」の最後、
p387にある[]演算子によるポイント型変数に関する記述において
「p[N]=*(p+N)でありp[N]=*(p+N)=* (N+p)=N[p]となり実質的に同じアドレス値になる」と説明しているのですが
なぜp[N]=N[p]になるのかよくわからないです。
p[N]とN[p]で先頭アドレスも添字も全く異なるポインタ型変数となると思うのですが、
なぜp[N]=N[p]となるのか?教えていただきたいです。
よろしくお願いします。
他にも情報があると思うのですが、
p,Nの定義はどうなっていますか。
例えば、
#define N 3
int p[10];
と定義されていて
p[N]とN[p]は同じになるというのはおかしいです。
tatsu99さん、C言語で p[3] と 3[p] は同じですよ。どちらの表記もできます。
int32_tさん。ご指摘ありがとうございます。
恥ずかしながら、C言語で p[3] と 3[p] は同じということを知りませんでした。
前の投稿は撤回いたします。
以下の文書で言及されています。
Rationale for International Standard - Programming Languages - C/Revision 5.10 April 2003
http://www.open-std.org/JTC1/SC22/WG14/www/docs/C99RationaleV5.10.pdf
6.5.2.1 Array subscripting
The C89 Committee found no reason to disallow the symmetry that permits a[i] to be written as i[a].
> p[N]とN[p]で先頭アドレスも添字も全く異なるポインタ型変数となると思う
つまり、ポインタ型pと整数型Nにおいてp+NとN+pの型や値が違うはずだ、という主張ですか?
> 質問者さん
+評価いただきましたが解決しましたか?
ソースコードまで作成して説明してくださりありがとうございました。
[ ]演算子がそれ自身が繋ぐ被演算子を読み取り、
被演算子の位置によらずその被演算子が
変数であればその先頭アドレスを読み取り、
整数であれば読み取りうる変数の型のサイズの係数として演算されるというように認識いたしました。
とにかく被演算子の位置によらず被演算子がどのような値なのか?によって
その処理を変えるのだと覚えようと思います。
ご丁寧な説明をしてくださりありがとうございました。

回答3件
あなたの回答
tips
プレビュー