C言語ワンポイント講座ポインタと派生型徹底入門 サンプルプログラム集

コンピュータを学習する人の学校:パソコンキャンパス、プログラミングキャンパス

ここでは、 The Office Uchida, School of Computerの e-Learningシステム 「C言語ワンポイント講座 ポインタと派生型入門」のためのサンプルプログラムを紹介しています。

この中に記載されているプログラムをブラウズあるいはカットアンドペーストしてください。

目次に戻る


第5章 const修飾子

内容
Sample list 5-1 変更可能・不可能領域の復習
Sample list 5-2 const char *
Sample list 5-3 char *const
Sample list 5-4 char *const *
Sample list 5-5 const char *const *
Sample list 5-6 const int (*)[]
Sample list 5-7 const int (*const)[]
Sample list 5-8 const int *[]
Sample list 5-9 int *const []

2次元のポインタ配列

Sample list 5-1 変更可能・不可能領域の復習sample5_1.c
#include<stdio.h>

int main( void )
{
	char s1[] = "abc"; /* この文字列は配列の初期値なので変更可 */
	char s2[] = "xyz"; /* この文字列は配列の初期値なので変更可 */
	char *s3  = "ABC"; /* この文字列は文字定数なので変更不可 */

	char *p = s1;

	printf( "[1] p=%s\n", p );

	p = s2;

	printf( "[2] p=%s\n", p );

	*p = '1';

	printf( "[3] p=%s\n", p );

	p = s3;

	printf( "[4] p=%s\n", p );

	// *p = 'Z'; /* <--- 不正なアクセス */

	printf( "[5] p=%s\n", p );

	return 0;
}
Sample list 5-1の実行結果(cygwin)

% gcc sample5_1.c
% ./a
[1] p=abc
[2] p=xyz
[3] p=1yz
[4] p=ABC
[5] p=ABC

プログラムのコメント部をはずしてコンパイルすると、.....。そこで、実行時エラーが起きてしまいます。

Sample list 5-1の実行結果(cygwin)

% gcc sample5_1.c
% ./a
[1] p=abc
[2] p=xyz
[3] p=1yz
[4] p=ABC
Segmentation fault (core dumped)

目次に戻る, 先頭に戻る


const char *

Sample list 5-2 const char *sample5_2.c
#include<stdio.h>

int main( void )
{
	const char s1[] = "abc";
	const char s2[] = "xyz";

	const char *p = s1; /* pの値を初期設定 */

	printf( "[1] p=%s\n", p );

	p = s2; /* pの値は変更可能 */

	printf( "[2] p=%s\n", p );

 	// *p = '1'; /* <--- const領域に書き込もうとしているので、エラーとなる */

	printf( "[3] p=%s\n", p );

	return 0;
}
Sample list 5-2の実行結果(cygwin)

% gcc sample5_2.c
% ./a
[1] p=abc
[2] p=xyz
[3] p=xyz

プログラムのコメント部をはずしてコンパイルすると、そこでコンパイルエラーが起きてしまいます。

Sample list 5-2のコンパイル結果(cygwin)

% gcc sample5_2.c
sample5_2.c: In function `main':
sample5_2.c:16: error: assignment of read-only location

参考文献:内田智史、秋元勝、北川雅巳、大津崇共著:「C言語によるプログラミング スーパーリファレンス編」、オーム社、p.91

目次に戻る, 先頭に戻る


char *const

Sample list 5-3 char *constsample5_3.c
#include<stdio.h>

int main( void )
{
	char s1[] = "abc";
	char s2[] = "xyz";

	char *const p = s1; /* pは、変更不可 */

	printf( "[1] p=%s\n", p );

	*p = '1'; /* pが指しているところは変更可 */

	printf( "[2] p=%s\n", p );

 	// p = s2; /* <--- const領域に書き込もうとしているので、エラーとなる */

	printf( "[3] p=%s\n", p );

	return 0;
}
Sample list 5-3の実行結果(cygwin)

% gcc sample5_3.c
% ./a
[1] p=abc
[2] p=1bc
[3] p=1bc

プログラムのコメント部をはずしてコンパイルすると、そこでコンパイルエラーが起きてしまいます。

Sample list 5-3のコンパイル結果(cygwin)

% gcc sample5_3.c
sample5_3.c: In function `main':
sample5_3.c:16: error: assignment of read-only variable `p'

参考文献:内田智史、秋元勝、北川雅巳、大津崇共著:「C言語によるプログラミング スーパーリファレンス編」、オーム社、p.91

目次に戻る, 先頭に戻る


char *const *

Sample list 5-4 char *const *sample5_4.c
#include<stdio.h>

int main( void )
{
	char s1[] = "abc";
	char s2[] = "xyz";

	char *const p1 = s1; /* p1は変更不可 */
	char *const p2 = s2; /* p2は変更不可 */

	char *const *p = &p1;  /* pが指している領域は変更不可 */

	printf( "[1] p=%s\n", *p );

	p = &p2; /* pは変更可 */

	printf( "[2] p=%s\n", *p );

 	**p = '1'; /* pが指している先のポインタが指している先は変更可 */

	printf( "[3] p=%s\n", *p );

 	// *p = p2; /* <--- const領域に書き込もうとしているので、エラーとなる */

	return 0;
}
Sample list 5-4の実行結果(cygwin)

% gcc sample5_4.c
% ./a
[1] p=abc
[2] p=xyz
[3] p=1yz

プログラムのコメント部をはずしてコンパイルすると、そこでコンパイルエラーが起きてしまいます。

Sample list 5-4のコンパイル結果(cygwin)

% gcc sample5_4.c
sample5_4.c: In function `main':
sample5_4.c:23: error: assignment of read-only location

参考文献:内田智史、秋元勝、北川雅巳、大津崇共著:「C言語によるプログラミング スーパーリファレンス編」、オーム社、p.92

目次に戻る, 先頭に戻る


const char *const *

Sample list 5-5 const char *const *sample5_5.c
#include<stdio.h>

int main( void )
{
	const char *const s1 = "abc"; /* s1が指している先は変更不可:そもそも文字列なので変更不可 */
	const char *const s2 = "xyz"; /* s2が指している先は変更不可:そもそも文字列なので変更不可 */

	const char *const p1 = s1; /* p1が指している先は変更不可 */
	const char *const p2 = s2; /* p2が指している先は変更不可 */

	const char *const *p = &p1; /* pが指している先とその先は変更不可 */

	printf( "[1] p=%s\n", *p );

	p = &p2; /* p自体は変更可 */

	printf( "[2] p=%s\n", *p );

 	// *p = p2; /* pが指している先は変更不可 */
 	// **p = '1'; /* pが指している先の先は変更不可 */

	return 0;
}
Sample list 5-5の実行結果(cygwin)

% gcc sample5_5.c
% ./a
[1] p=abc
[2] p=xyz

プログラムのコメント部をはずしてコンパイルすると、そこでコンパイルエラーが起きてしまいます。

Sample list 5-5のコンパイル結果(cygwin)

% gcc sample5_5.c
sample5_5.c: In function `main':
sample5_5.c:19: error: assignment of read-only location
sample5_5.c:20: error: assignment of read-only location

参考文献:内田智史、秋元勝、北川雅巳、大津崇共著:「C言語によるプログラミング スーパーリファレンス編」、オーム社、p.92

目次に戻る, 先頭に戻る


const int (*)[]

Sample list 5-6 const int (*)[]sample5_6.c
#include<stdio.h>

int main( void )
{
	const int a[] = { 1,2,3,4,5,6, }; /* 配列要素は変更不可 */
	const int b[] = { 11,12,13,14,15,16, }; /* 配列要素は変更不可 */
	const int (*k)[6] = &a; /* kが指している配列要素は変更不可 */
	int i;

	for( i=0; i<6; i++ ) /* まずはデータを表示する */
		printf( "%d ", (*k)[i] );
	printf( "\n" );

	k = &b; /* k自体は変更可 */

	for( i=0; i<6; i++ ) /* 変更後のデータを表示する */
		printf( "%d ", (*k)[i] );
	printf( "\n" );

	// (*k)[3] = 9; /* kの指している配列要素を変更しようとしているのでエラー */

	return 0;
}
Sample list 5-6の実行結果(cygwin)

% gcc sample5_6.c
% ./a
1 2 3 4 5 6
11 12 13 14 15 16

プログラムのコメント部をはずしてコンパイルすると、そこでコンパイルエラーが起きてしまいます。

Sample list 5-6のコンパイル結果(cygwin)

% gcc sample5_6.c
sample5_6.c: In function `main':
sample5_6.c:20: error: assignment of read-only location

参考文献:内田智史、秋元勝、北川雅巳、大津崇共著:「C言語によるプログラミング スーパーリファレンス編」、オーム社、p.93

目次に戻る, 先頭に戻る


const int (*const)[]

Sample list 5-7 const int (*const)[]sample5_7.c
#include<stdio.h>

int main( void )
{
	const int a[] = { 1,2,3,4,5,6, }; /* 配列要素は変更不可 */
	const int b[] = { 11,12,13,14,15,16, }; /* 配列要素は変更不可 */
	const int (*const k)[6] = &a; /* kとkが指している配列要素は変更不可 */
	int i;

	for( i=0; i<6; i++ )
		printf( "%d ", (*k)[i] );
	printf( "\n" );

	// k = &b; /* kの値は変更できない */
	// (*k)[3] = 9; /* kの指している配列要素を変更しようとしているのでエラー */

	return 0;
}
Sample list 5-7の実行結果(cygwin)

% gcc sample5_7.c
% ./a
1 2 3 4 5 6

プログラムのコメント部をはずしてコンパイルすると、そこでコンパイルエラーが起きてしまいます。

Sample list 5-7のコンパイル結果(cygwin)

% gcc sample5_7.c
sample5_7.c: In function `main':
sample5_7.c:14: error: assignment of read-only variable `k'
sample5_7.c:15: error: assignment of read-only location

参考文献:内田智史、秋元勝、北川雅巳、大津崇共著:「C言語によるプログラミング スーパーリファレンス編」、オーム社、p.93

目次に戻る, 先頭に戻る


const int *[]

Sample list 5-8 const int *[]sample5_8.c
#include<stdio.h>

int main( void )
{
	const int t1 = 3, t2 = 4, t3 = 5; /* t1, t2, t3は変更不可 */
	const int *k[] = { &t1, &t2, &t3, }; /* kの各要素が指している先は変更不可 */
	int i;

	for( i=0; i<3; i++ ) /* まず表示する */
		printf( "%d ", *k[i] );
	printf( "\n" );

	k[0] = &t3; /* kの要素は変更可能 */

	for( i=0; i<3; i++ ) /* 変更後の値を表示する */
		printf( "%d ", *k[i] );
	printf( "\n" );

	// *k[1] = 7; /* ポインタ配列k[1]の指している先は変更できない */

	return 0;
}
Sample list 5-8の実行結果(cygwin)

% gcc sample5_8.c
% ./a
3 4 5
5 4 5

プログラムのコメント部をはずしてコンパイルすると、そこでコンパイルエラーが起きてしまいます。

Sample list 5-8のコンパイル結果(cygwin)

% gcc sample5_8.c
sample5_8.c: In function `main':
sample5_8.c:19: error: assignment of read-only location

参考文献:内田智史、秋元勝、北川雅巳、大津崇共著:「C言語によるプログラミング スーパーリファレンス編」、オーム社、p.94

目次に戻る, 先頭に戻る


int *const []

Sample list 5-9 int *const []sample5_9.c
#include<stdio.h>

int main( void )
{
	int t1 = 3, t2 = 4, t3 = 5;
	int *const k[] = { &t1, &t2, &t3, }; /* 配列要素は変更不可 */
	int i;

	for( i=0; i<3; i++ ) /* まずは表示する */
		printf( "%d ", *k[i] );
	printf( "\n" );

	*k[1] = 7; /* 配列要素が指しているオブジェクトは変更可 */

	for( i=0; i<3; i++ ) /* 変更後の表示する */
		printf( "%d ", *k[i] );
	printf( "\n" );

	// k[0] = &t3; /* ポインタ配列kの要素は変更できない */

	return 0;
}
Sample list 5-9の実行結果(cygwin)

% gcc sample5_9.c
% ./a
3 4 5
3 7 5

プログラムのコメント部をはずしてコンパイルすると、そこでコンパイルエラーが起きてしまいます。

Sample list 5-9のコンパイル結果(cygwin)

% gcc sample5_9.c
sample5_9.c: In function `main':
sample5_9.c:19: error: assignment of read-only location

参考文献:内田智史、秋元勝、北川雅巳、大津崇共著:「C言語によるプログラミング スーパーリファレンス編」、オーム社、p.94

目次に戻る, 先頭に戻る


Copyright (c) 2006 Satoshi Uchida, The Office Uchida, School of Computer