- ベストアンサー
ポインター変数名と配列名は同じでよいのでしょうか?
C言語で int *data; data[0]=0x15; という記述を見ました。 私にはdataはポインター変数名 であり配列名に思えます。 (ポインター変数へポインター定数を代入するには data = data; ???) しかし入門書にはこんな例はありませんでした。 私の解釈とはちがった意味があるのでしょうか? 教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
「a[5]」のような記述があった場合、aが配列名であるとは限りません。 「a[5]」というのは「*(a + 5)」とまったく同じ意味です。この記述ではaが配列名ではなく、ポインタ変数であってもいいですよね? つまり、「data[0] = 0x15」という記述は、「*data = 0x15」と書いてあるのと同じとおもえばいいです。 ただしほかの方がおっしゃるようにdataの実体が確保されていなければなりません。 それから、ポインタ変数と配列名は実はちょっとちがったものです。 たとえば「int a[5]」と宣言したときにaは配列名です。そしてaが配列名であると同時に配列の先頭アドレスを指していることは知っていると思います。 しかしaはポインタ変数ではなく、「a++」や「a = p」(pはポインタ変数)というようなことはできません。 つまりポインタ変数が指すアドレスの値は変えることができるが、配列名の指すアドレスの値はかえることができない、ということです。 余談ですが、上で「a[5]」=「*(a + 5)」であると書きましたが、右側の式は「*(5 + a)」とも書けますね。すると逆の変換をすると「5[a]」となります。 実はこれでも一応オッケーなのです。 2つはまったく同じ値となります。 そして驚くべきことに「3["hoge"]」なんてこともできます。 実用性はまったくないですけどね…。
その他の回答 (4)
- Trick--o--
- ベストアンサー率20% (413/2034)
一言で言うと 「ポインタは配列のように扱うことが出来る」 ということです。 使い方次第ではとても醜悪なものになりますが……
- a-saitoh
- ベストアンサー率30% (524/1722)
他の方が説明されているとおりですが、このことを理解されていないと言うことは、残念ながらお読みになった入門書が良書ではなかったのではないかと想像されます。 あらためて、中級のCの本などを読まれることをお勧めします。このあたりをしっかり理解しておかないと、今後の上達はおぼつかないので。
- phoenix343
- ベストアンサー率15% (296/1946)
表現の仕方が違うだけで同じです.違うところは int *a; int b[5]; とやった上で,それぞれa[0],b[0]を参照しようとすると,aの方が実体が無いので最悪ハングする,という点です.もちろんa[0]を参照する前にa=b;なり実体を示す先を指定してやれば大丈夫です. ……ってこんな説明でいいかな?違ってたらツッこんでください(-_-;.
- Missing0001
- ベストアンサー率41% (5/12)
すまない! よくわからんがこれって、 int *data; int a[5]; data = a; data[0]=0x15; や int *data; data = (int *)malloc(sizeof(int) * 5); data[0]=0x15; free(data); といった使い方がわからないって質問?
お礼
回答ありがとうございました。 たいへん勉強になりました。