Monday, January 19, 2009

Cのポインタ

プログラミング言語Cを読んでいる
ポインタのところに来て
Rubyとの違いを意識したら
理解できたような気がするのでメモ

1.値渡しと参照渡し
(Ruby)
a = 10, b = a とすると
aもbも同じオブジェクト10を指すことになる

(C)
a = 10, b = aとすると
bには10のコピーが入る
Rubyと同じように同じオブジェクトを指すようにするには
b = &aでaのアドレスをbに持たせれば
*bでaが指しているものを指すようになる

つまりRubyはデフォルトで参照渡しで
Cはデフォルトで値渡し

2.関数の引数
Cはデフォルトで値渡しなので
関数に与える引数自身を変更したい場合
例えばswap(a, b)では目的を達成できない
だからこの場合swap(&a, &b)としてアドレスを渡し
それを受ける関数側では
void swap(int *px, int *py)などとする(ここがちょっとわからない)

3.配列
int a[10]の配列宣言において
aは、その先頭アドレスを格納する
だからこれはa = &a[0]と等価であり
よって*aでその内容を参照できるようになる
さらに*(a+i)は配列aのi番目の要素を参照することになる

4.関数
void func()に対してfuncはその関数の基底アドレスを表す
だからptr = funcでptrはfuncの基底アドレスをさすことになる
このときptrの宣言はただのポインタ宣言であるint *ptrではなく
int (*ptr)()として括弧を付けて関数のポインタ宣言とする必要がある
(int *ptr()は*(ptr())と解釈されてしまうので不可)

No comments: