C言語で関数に配列を渡すときのコーディングスタイル
昨日
配列を関数に渡す?
楽勝っていうwwwwwww簡単すぎっていうwwwwwwwwww
と気楽に演習問題をやってました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <stdio.h> void function(int *); int main(void) { int array[3] = {1, 2, 3}; function(array); return 0; } void function(int *data) { int i; for (i = 0; i < 3; i++) printf("%d\n", data[i]); } |
「簡単だったな〜じゃあ俺提出して帰るから」
といつもならすんなり終わるんですが、終わりませんでした。
原因はここ
18 19 |
for (i = 0; i < 3; i++) printf("%d\n", data[i]); |
一見してごく一般的なC言語のコードですが、一体なにがおかしかったのか。
ユーザー定義関数のfunctionはfunction(int *)
となっている通り、引数にint型ポインタを取ります。
そして、配列の先頭アドレスを引数に渡し、関数内では配列と同じように[]
を使ってアクセスしています。
しかしながら先生は
1 2 |
for (i = 0; i < 3; i++) printf("%d\n", *(data + i)); |
のように書けとのこと。
しかもこちらのほうが良いそうです。
正直言って僕はこの書き方をするのは嫌でした。
なぜなら、タイプ数が増えるし、配列を扱うなら関数内でも同じような書き方をしたほうがどう考えても分かりやすいと思うからです。
それならプロトタイプ宣言や関数の定義の時に引数を
1 |
void function(int []); |
こう書くべきだということですが、関数に渡しているのは配列ではなく配列へのポインタなのであまりこうは書きたくはないです。
配列と違ってアドレスを変えても大丈夫ですしね。
1 2 |
int array[5]; array++; //ng |
結論
結論からいうと
1 |
*(data + i) |
1 |
data[i] |
も結局全く同じことなので割とどうでもいいのですが、そんなどうでもいいことで解答を受け付けてもらえないほどのことにまでなってしまいました。
なお、「これって割とどうでもいいことですよね」とは言いましたが、どうでもよくないことらしくC言語歴が短すぎるNOOBにはさっぱり理解できませんでしたし、まったく納得できませんでした。
あとがき
くどいようですが、こんなことどうでもいいのでさっさと*(data + i)
と書きなおして終了です。
なお、自分で書くコードは今後もdata[i]
であり続けます。
だってどっちで書いてもどうでもいいし。