2016.08.20 ポインタへの格下げ

近くのドトールでもくもくとCを触る。

コンパイラ入門を2章まで読んだ。コンパイラの構成(フロントエンド、バックエンド)の解説と、例題として実装していく言語SL/0, SL/1の仕様の説明。めっちゃシンプルな仕様なので自分のような超初心者にピッタリ。まだ内容についていけている。

Head First Cも2章の途中まで進んだ。途中、配列変数がポインタへ格下げされる仕様にハマったのでメモ。

void f(char s[])
{
	// 関数に配列を渡すとポインタに格下げされ、配列のサイズについての情報を失うため
	// ポインタのサイズが出力される.
	// -> 8 (64bitマシンの場合)
	printf("%lu\n", sizeof(s));
	
	// コンパイル時に警告してくれる
	// blog.c:4:27: warning: sizeof on array function parameter will return size of 'char *' instead of 'char []' [-Wsizeof-array-argument]
}

int main()
{
	char s[] = "How big is it?";

	// 配列変数が配列のサイズを保持しているため
	// 配列のサイズが出力される.
	// -> 15 (14文字 + 改行)
	printf("%lu\n", sizeof(s));

	f(s);
	
	return 0;
}