C言語なら俺に聞け(入門篇) Part 43
■ このスレッドは過去ログ倉庫に格納されています
0245デフォルトの名無しさん
2009/01/27(火) 04:09:02たとえば、
struct foo { bar_t bar; };
struct foo foo_array[4];
struct foo *foo_ptr_of_array[] = {foo_array, foo_array+1, foo_array+2, foo_array+3};
struct foo *(*ptr_to_foo_ptr_of_array)[] = &foo_ptr_of_array;
struct foo *(*ptr_to_ptr_to_foo) = foo_ptr_of_array;
foo_ptr_of_array[0]->bar = barFoo;
(*ptr_to_foo_ptr_of_array)[0]->bar = barBar;
(*(ptr_to_ptr_to_foo + 0))->bar = barBaz;
さすがに最後はないだろうとは思うけど。
私は、配列なら添え字演算子を使い、ポインタなら間接参照を使うので、
この場合は、2番目を選ぶと思う。明らかに、最後のは、配列をポインタに成り下げているから、嫌だ。
配列は配列。ポインタはポインタです。混同するのはよくない。
ポインタに間接参照を使う理由は、関数の引数やローカル変数が、間接参照をされている場合、
ポインタなので(+1)、それなりの注意をして読んだり書き直したりできる。
たとえば、NULLポインタチェック、アロケートとフリーの対応、リテイン(他のポインタが、同じアロケート先をさしていないか)チェックなど。
(+1 配列もポインタに成り下がれるけどe.g. sizeof(array)/sizeof(*array)当然私は、sizeof(array)/sizeof([0])のほうを使うけど)
■ このスレッドは過去ログ倉庫に格納されています