2010年11月10日

C言語ポインタの構文ェ・・・・

最近はてなで話題になったポインタの解説を見ていて思い出した....
int a;
int *b = &a;

/* グローバル変数aに100を代入 */
void function1(void) {
  a = 100;
}

/* ローカル変数aに100を代入 */
void function2(void) {
  int a = 100;
}

/* グローバル変数bの示す先に100を代入 */
void function3(void) {
  *b = 100;
}

/* ローカル変数bの示す先に100を代・・・入・・・!? */
void function4(void) {
  int *b = 100;
}
「int *b;」の書き方は、「*bはint型」という意味である、という解説がなされる
しかしそれだとfunction3の「*b = 100」では逆参照が起こり、function4の「int *b = 100;」では逆参照が起きない動作には納得できない。
上記解説を文字通りとれば、「int *b = 100;」は「bを逆参照したいがそれは不可能」という理由でコンパイルエラーになるべきだと思う。

それに対し、「int *b;」と書いてあったら「int* b;」と脳内変換して、「bはint*型」と考える回避策がある
しかしそうなると「int* a, b, c;」 みたいな宣言の説明がうまくできない。

どっちに転んでもなんか変。

とりあえず、完全に言いがかりだけど前者の考え方が頭がいい人達の自己満足みたいに見えて嫌なので僕は後者の書き方をいつもしてます
「int* a, b, c;」の書き方は、宣言と同時の初期化ができないのでやらない

 

コメントする





トラックバック(0)

トラックバックURL: http://www.lunaport.net/mt/mt-tb.cgi/28

るなぽブログ

最近のブログ記事

その他