• ベストアンサー

&a[0]とa[10]の違いについて

char a[10];と宣言されている時に、関数への引数として、&a[0]とする場合とa[10]とする場合でどこが違ってくるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

> (しかもa[9]にはNULLがはいるし) NULLとは'\0'のことですか? もしそうだとして、配列の最終要素に必ず'\0'が入るという 保証はどこにもありません。 その配列を関数の外部で定義していたり、関数の内部でstatic付きで 定義していたりすれば、最終要素を含めて全要素に'\0'が入ります。 それ以外の場合、a[0]~a[9]には何が入っているかわかりません。いわゆる「ゴミ」が入っている状態です。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

例えば、 void func(char *s) { /* 何かの処理 */ } のようなfunc()があるとします。 お聞きになりたいのは、main()などからfunc()を呼び出す場合の 引数の書き方についてですか?だとすると、 func(&a[0]); と書くと、func()には、配列aの先頭要素のアドレスが渡ります。func(a); と書いても同じです。 func(a[10]); と書くと、func()には、配列aの10番目の要素を渡そうとします。func()が想定している引数とは型が異なります。 また、配列aは[10]と定義しているため、a[10]は定義範囲外の領域です。

  • ilice
  • ベストアンサー率50% (3/6)
回答No.1

&a[0]を送るのとa[10]を送るのではぜんぜん違います。 &a[0]の場合、a[0]のアドレスを送ります。 a[10]の場合、a[10]の中の値を送ります。 &a[0]を送った時、a[10]を参照するにはa[10]のアドレスまで移動しなければいけません。 a[10]を送った時、a[10]の中の値だけを渡すので送り先の関数から再びa[10]の中身を参照することは出来ません。 アドレスを渡すのと値を渡すのとでは全然ちがうと思いますよ。 そもそも char a[10]; という宣言ではa[0]~a[9]しか使えないと思いますよ。 (しかもa[9]にはNULLがはいるし)

関連するQ&A