こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語 ポインタと配列

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

投稿日時 - 2009-01-20 01:44:55

QNo.4644798

暇なときに回答ください

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

いきなり
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ごとに違うので、どちらと明言する事は出来ませんが、明らかに言えるのは「前者と後者では、異なる機械語コードが生成される筈だから、速度に差が出る筈」と言う事。

ま、どう考えても「毎回、加算を行ってアドレス値を作る」のと「アドレス値を持って来るだけ」なら、後者の方が早いでしょう(断言はしませんが)

そう言った訳で「連続したアドレスから順番に中身を取り出す」とか「連続したアドレスに順番に中身を詰め込む」なら、ポインタを用いるべきでしょう。

投稿日時 - 2009-01-20 13:10:29

お礼

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

投稿日時 - 2009-01-27 00:48:15

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

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

投稿日時 - 2009-01-20 07:25:07

お礼

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

投稿日時 - 2009-01-27 00:47:08

ANo.1

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

>処理速度ではどちらが上でしょうか?

同じです。

投稿日時 - 2009-01-20 01:51:17

お礼

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

投稿日時 - 2009-01-27 00:46:29

あなたにオススメの質問