読者です 読者をやめる 読者になる 読者になる

破棄されたブログ

このブログは破棄されました。

C におけるポインタの表記方法に対する混乱の要因について

C 言語なんて使わんのだよね。使えたほうがいいんだろうけど、ぬるく Web 系をやってる分には全然つかわんのだよ。
まあ、でもそうも言っていられなくなったので、 Head First C ―頭とからだで覚えるCの基本 とか買ってみたりしちゃったりなんかしちゃってね。
Java とかは参照渡し*1だし、 PHP もオブジェクトはリファレンス渡しだから、参照が渡るっていう考えはわかるんだけど、なんかどうもしっくりこないんで考えてみてたら、なんとなく原因がわかったからメモしとく。

原因

ポインタは、変数宣言時のみ変数名に * をつけた状態でアドレスを代入する。

宣言時 代入文
int *p = &var; p = &var;

つまるところ、表記方法に一貫性を感じられないから、混乱してた。
ポインタにアドレスを指定する方法は、宣言時とそれ以外では異なっている。

宣言時

int x = 4;
/* 変数名に * がついているがアドレスを代入できる */
int *address_of_x = &x;

/* x のアドレスを表示 */
pirntf("address of x: %p\n", address_of_x);

代入文

int x = 4;
int *address_of_x;


/* address_of_x に x のアドレスを指定する際には * を付けない */
address_of_x = &x;

/*
 * これは誤り
 * warning: assignment makes integer from pointer without a cast
 */
/* *address_of_x = &x; */

/* x のアドレスを表示 */
pirntf("address of x: %p\n", address_of_x);

したがって、* 演算子は参照解決を行うのであって、変数宣言時の * はポインタであることを明示するためのものであることを念頭に置けていなかったため混乱していた。

Head First C ―頭とからだで覚えるCの基本

Head First C ―頭とからだで覚えるCの基本

*1:厳密には違うとかいう話も聞いたけど、普段使わないんでよく知らん。

広告を非表示にする