C言語,const とポインタの組み合わせで、可能・不可能なこと

スポンサーリンク

鍛錬 238

C言語,const とポインタの組み合わせで、可能・不可能なこと

const とポインタの組み合わせで、可能・不可能なことについてです。
 
以下は、次に示す 2 通りの組み合わせについて実際に確認しています。

const int *x
int* const x

const int *x の場合

const int *x の場合、デリファレンスして値を変更することは不可能ですが、ポインタを変更することは可能です。
 
デリファレンスして値を変更

以下は、デリファレンスして値を変更しようとしているプログラム check_const.c です。

コンパイル時にエラーとなります。

// include
#include <stdio.h>

// main
int main(void)
{
	const int *x = 0;
	
	*x = 123;
	
	printf("*x = %d\n", *x);
	
	return 0;
}
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra check_const.c -o check_const
check_const.c: In function ‘main’:
check_const.c:10:5: error: assignment of read-only location ‘*x’
  *x = 123;
     ^

 
ポインタを変更

以下は、ポインタを変更しているプログラム check_const_2.c です。

コンパイルに成功します。

// include
#include <stdio.h>

// main
int main(void)
{
	const int *x = 0;
	int y;
	
	y = 456;
	x = &y;
	
	printf("*x = %d\n", *x);
	
	return 0;
}
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra check_const_2.c -o check_const_2
***@ubuntu:~/***/test/c$ ./check_const_2
*x = 456

int* const x の場合

int* const x の場合、デリファレンスして値を変更することは可能ですが、ポインタを変更することは不可能です。
 
デリファレンスして値を変更

以下は、デリファレンスして値を変更しているプログラム check_const_3.c です。

コンパイルに成功します。

// include
#include <stdio.h>

// main
int main(void)
{
	int y = 0;
	int* const x = &y;
	
	*x = 123;
	
	printf("*x = %d\n", *x);
	
	return 0;
}
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra check_const_3.c -o check_const_3
***@ubuntu:~/***/test/c$ ./check_const_3
*x = 123

 
ポインタを変更

以下は、ポインタを変更しようとしているプログラム check_const_4.c です。

コンパイル時にエラーとなります。

// include
#include <stdio.h>

// main
int main(void)
{
	int y = 0;
	int* const x = &y;
	int z;
	
	z = 456;
	x = &z;
	
	printf("*x = %d\n", *x);
	
	return 0;
}
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra check_const_4.c -o check_const_4
check_const.c: In function ‘main’:
check_const.c:13:4: error: assignment of read-only variable ‘x’
  x = &z;
    ^
スポンサーリンク

シェアする

フォローする