• ベストアンサー

C言語 ポインタと配列

C言語で配列をあつかう場合、ポインタをつかうか、配列の添え字を使って処理するか迷うのですが、どちらが良いのでしょうか? 処理速度ではどちらが上でしょうか?

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

  • ベストアンサー
回答No.3

いきなり a[x] と書いた場合は、他の回答のように *(a+x) と同じ処理速度です。 しかし for(i=0;i<1000;) { ホゲホゲ=a[i++]; } と 型 *p = a; for(i=0;i<1000;) { ホゲホゲ=*p++; } では、処理速度に差が出ます。 前者では「毎回、aとiを加算して実効アドレス値を求め、値の取り出し後、iをインクリメントする」と言う処理が行われます。 しかし、後者では「毎回のアドレスの計算はせず、pから直接に実効アドレスをロードして使い、値の取り出し後、pに一定値を加算する」と言う処理が行われます。 「どちらが早いか?」は、コンパイラごと、実行するCPUごとに違うので、どちらと明言する事は出来ませんが、明らかに言えるのは「前者と後者では、異なる機械語コードが生成される筈だから、速度に差が出る筈」と言う事。 ま、どう考えても「毎回、加算を行ってアドレス値を作る」のと「アドレス値を持って来るだけ」なら、後者の方が早いでしょう(断言はしませんが) そう言った訳で「連続したアドレスから順番に中身を取り出す」とか「連続したアドレスに順番に中身を詰め込む」なら、ポインタを用いるべきでしょう。

szatmari
質問者

お礼

そのはずですよね。納得しました。回答ありがとうございました。

その他の回答 (2)

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

#1さんのおっしゃるとおりです。 a[x]という表記は*(a+x)の「糖衣構文(syntax sugar)」です。ググってみてください。 どちらがよい・悪いということはありません。

szatmari
質問者

お礼

回答ありがとうございます。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

a[x] という形か、*(a+x) という形かと言うことですよね? そのデータが「配列」なのなら、a[x] がわかりやすいでしょうね。「aという配列のx番目の要素」というのがストレートに表現できるので。 >処理速度ではどちらが上でしょうか? 同じです。

szatmari
質問者

お礼

回答ありがとうございます。