const

constを使いこなそう!

#include <stdio.h>

int main(int argc, char *argv[])
{
	char abc[] = "abc";

	const char *p1 = abc;
	char * const p2 = abc;

	printf( "p1 = %s\n", p1 );
	p1++;
	printf( "p1 = %s\n", p1 );
	p1++;
	printf( "p1 = %s\n", p1 );

	printf( "p2 = %s\n", p2 );
	// p2++; error: increment of read-only variable ‘p2’         

	p1 = abc;
	// p1[0] = 'd'; error: assignment of read-only location
	printf( "p1 = %s\n", p1 );

	// p2 = abc; error: assignment of read-only variable ‘p2’
	p2[0] = 'd';
	p2[1] = 'e';
	p2[2] = 'f';
	printf( "p2 = %s\n", p2 );

	printf( "abc[] = %s\n", abc );
	return 0;
}

実行結果
p1 = abc
p1 = bc
p1 = c
p2 = abc
p1 = abc
p2 = def
abc[] = def

constの位置によって意味が変わるよ!
ポインタに*を付けると、値を書き換えられるの覚えているかな?
constがchar *に掛かっていると、
値の書き換えをCコンパイラさんが監視してくれるよ。
p2は、char *ではなくて、p2にconstが掛かっているね。
これだと、p2そのものを変更出来ないようにCコンパイラさんが監視してくれるよ。
でも、p2を使って値の書き換えは出来ちゃうから、
こういう使い方はあまりしないよ。
p1は、途中で配列の先頭アドレスを代入出来るけど、
p2は、constで監視されているのも確認してね。

関数の引数でポインタを受け取るときに、
このポインタを使って書き換えは行わないよって宣言するのに、
constはよく使われるよ。

前回のソースコードをもう一度、確認してみてね!

Leave a Comment