• ベストアンサー

ポインタについて

ポインタについてですが、下記のプログラムで、 data = array;  で、array[0] のアドレスを代入してますよね? for文で、all+= data[i];では、 どんな計算がおこなわれていますか? dataにarray[0]のアドレスが代入されているので、アドレスの足し算が行われているんですか?(よく解らないのですが。) 教えてください。 #include <stdio.h> int main(void) { int *data; int i, all = 0, array[10] =15,78,98,15,98,85,17,35,42,15; data = array; for (i = 0;i < 10;i++) { all+= data[i]; } printf("%d\n",all/ 10); return 0; }

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

式中では、配列は「配列の先頭要素へのポインタ」に読み換えられます。 つまり、  data = array; は  data = &array[0]; と書いたのと同じ事です。 (ただし、「配列の先頭要素へのポインタ」に読み換えられない例外が存在します。 例えば、sizeof演算子のオペランドになったときなど。) また、配列の要素にアクセスするときには添字演算子[ ]を用いて  p[i] このように行いますが、これは以下の式と全く同じ意味になります。  *(p+i) 同じ意味なので、全部後者の書き方にすることも可能ですが、 添字演算子[ ]を用いた方が読み書きしやすいので、 配列の要素にアクセスするときなどは普通こちらを使います。 よって、  data[0] は、  *(data+0) と等価なので、dataに配列arrayの先頭要素へのポインタが入っていれば、 data[0]で配列arrayの先頭要素にアクセスできることになります。

startover
質問者

お礼

参考になります。 どうもありがとうございました。

その他の回答 (3)

  • bnosuke
  • ベストアンサー率21% (4/19)
回答No.4

1) array は 単なるint * 型の定数です。値は &array[0] です。 2) array[i] と *(array + i) は全く等価です。 3) *(data + i) と data[i] は全く等価です。 4) 2)と3)の違いは、arrayという定数か、dataという変数か、の違いで、それ以外は本質的に全く違いはありません。ですから、機械的に置き換えることができます。 5)故に、 data == array の時、2) 3)は全て同じことを内部では行っています。

startover
質問者

お礼

かいとうありがとうございました。 参考にしてみます。

  • ddnp009
  • ベストアンサー率25% (15/58)
回答No.3

まず int array[] = {15,78,98,15,98,85,17,35,42,15}; array == &array[0]、 ・配列名は、その先頭要素を指すポインタとみなされる。 int *data = array; ・intへのポインタdataは、配列arrayの先頭要素を指す。 解釈1、  data は &array[0]の別名(alias)である。  (同じアドレスを指し、型も一致するため) 解釈2、  data は intを指す独立したポインタであり、  (たまたま)配列arrayの先頭要素を指す。 1の解釈をした場合、all += data[i] は 非常にすんなり飲み込めるでしょう。 all += array[i] と等価。 2の解釈をした場合、dataは独立した"ポインタ"なので、 data[i]とするよりも、 *(data + i)としたほうがポインタとしての働きに適いますね。 コンパイラの解釈はdata[i]も*(data + i)も一緒。

startover
質問者

お礼

参考になります。 どうもありがとうございました。

回答No.1

all+= data[i]; 右辺式は、dataの配列要素のi番目を取り出しています。 allに加算されるというだけです。 もっと細かくいうと、Cにおいて、配列とポインタは等価です。 data自体はポインタですが[ ]が付く事で配列と同じようになります。 そして、実際にはポインタdataの指す属性(ここでは、int *dataと定義されているので int)のサイズ分とインデックスiに応じた分だけポインタが加算されるということです。 まず、data=arrayとしているので、data=&array[0]の状態です。 これで、data[i]のiの値を進めると data[0]・・ポインタdataが指すint属性の値、即ちarray[0] data[1]・・ポインタdata+sizeof(int)*1 が指す位置にあるint属性の値、即ちarray[1]          : data[n]・・ポインタdata+sizeof(int)*n が指す位置にあるint属性の値、即ちarray[n] という関係です。

startover
質問者

お礼

参考になります。 どうもありがとうございました。