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

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

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

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

目次に戻る


第4章 派生型 本格入門

内容
Sample list 4-1 2次元のポインタ配列
Sample list 4-2 ポインタ配列を指すポインタ
Sample list 4-3 2次元配列を指すポインタ
Sample list 4-4 関数を指すポインタを返す関数
Sample list 4-5 配列を指すポインタを返す関数
Sample list 4-6 ポインタ配列を指すポインタを返す関数
Sample list 4-7 不完全型の配列を指すポインタ

2次元のポインタ配列

Sample list 4-1 2次元のポインタ配列sample4_1.c
#include<stdio.h>

int main( void )
{
	int *k[2][3]; /* 2次元のポインタ配列 */
	int t0=0,t1=1,t2=2,t3=3,t4=4,t5=5;
	int i,j;

	k[0][0] = &t0; /* 配列kの各要素には、int型を指すポインタを格納する */
	k[0][1] = &t1;
	k[0][2] = &t2;
	k[1][0] = &t3;
	k[1][1] = &t4;
	k[1][2] = &t5;

	for( i=0; i<2; i++ )
	{
		for( j=0; j<3; j++ )
		{
			int m = *k[i][j]; /* 2次元のポインタ配列の指している値を取り出す */
			printf( "%d ", m );
		}
		printf( "\n" );
	}

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

% gcc sample4_1.c
% ./a
0 1 2
3 4 5

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

目次に戻る, 先頭に戻る


ポインタ配列を指すポインタ

Sample list 4-2 ポインタ配列を指すポインタsample4_2.c
#include<stdio.h>

int main( void )
{
	int t1=1, t2=2, t3=3;
	int *a[3] /* 3つのint型を指すポインタを要素を持つポインタ配列 */
		= { &t1, &t2, &t3 }; /* 初期値をセット */
	int *(*k)[3] = &a; /* ポインタ配列を指すポインタにポインタ配列aのアドレスをセット */
	int j1, j2, j3;

	j1 = *(*k)[0];
	j2 = *(*k)[1];
	j3 = *(*k)[2];

	printf("j1=%d, j2=%d, j3=%d\n", j1, j2, j3 );

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

% gcc sample4_2.c
% ./a
j1=1, j2=2, j3=3

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

目次に戻る, 先頭に戻る


2次元配列を指すポインタ

Sample list 4-3 2次元配列を指すポインタsample4_3.c
#include<stdio.h>

int main( void )
{
	int a[2][3] = { { 1, 2, 3, }, { 4, 5, 6, }, }; /* 2次元配列 */
	int (*k)[2][3] = &a; /* 2次元配列を指すポインタに2次元配列aのアドレスをセット */
	int i,j;

	for( i=0; i<2; i++ )
	{
		for( j=0; j<3; j++ )
		{
			int m = (*k)[i][j];
			printf( "%d ", m );
		}
		printf( "\n" );
	}

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

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

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

目次に戻る, 先頭に戻る


関数を指すポインタを返す関数

Sample list 4-4 関数を指すポインタを返す関数sample4_4.c
#include<stdio.h>

double f1( char c )
{
	return c + 1.0;
}

double f2( char c )
{
	return c + 2.0;
}

double (*f(int flag))( char ) /* 関数を指すポインタを返す関数 */
{
	if( flag == 0 )
		return f1;
	else
		return f2;
}
	
int main( void )
{
	double (*p)(char); /* 関数を指すポインタ */
	char c = (char)0;
	double x;

	p = f( 0 ); /* 関数f(0)の実行結果(関数へのポインタ)をpにセット */
	x = p( c ); /* その関数を実行 */
	printf( "[1] x = %g\n", x );

	p = f( 1 ); /* 関数f(0)の実行結果(関数へのポインタ)をpにセット */
	x = p( c ); /* その関数を実行 */
	printf( "[2] x = %g\n", x );

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

% gcc sample4_4.c
% ./a
[1] x = 1
[2] x = 2

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

目次に戻る, 先頭に戻る


配列を指すポインタを返す関数

Sample list 4-5 配列を指すポインタを返す関数sample4_5.c
#include<stdio.h>

int (*a(double x))[2] /*配列を指すポインタを返す関数 */
{
	static int t[2] = { 10, 20, }; /* 返却値:staticであることに注意 */

	t[0] += x;
	t[1] += x;

	return &t;
}
	
int main( void )
{
	int (*q)[2] = a( 2.0 ); /* 関数の呼び出し */
	int q1 = (*q)[0];
	int q2 = (*q)[1];

	printf( "q1=%d, q2=%d\n", q1, q2 );

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

% gcc sample4_5.c
% ./a
q1=12, q2=22

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

目次に戻る, 先頭に戻る


ポインタ配列を指すポインタを返す関数

Sample list 4-6 ポインタ配列を指すポインタを返す関数sample4_6.c
#include<stdio.h>
#include<math.h>

int *(*f( double x, int y ))[2] /* ポインタ配列を指すポインタを返す関数の例 */
{
	static int t1 = 10, t2 = 20;
	static int *t[2] = { &t1, &t2, }; /* ポインタ配列 */

	t1 += x;
	t2 += y;

	return &t; /* ポインタ配列tのアドレスを返す */
}
	
int main( void )
{
	int *(*q)[2] = f( 2.0, 5 ); /* 関数呼び出し */
	int q1 = *(*q)[0];
	int q2 = *(*q)[1];

	printf( "q1=%d, q2=%d\n", q1, q2 );

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

% gcc sample4_6.c
% ./a
q1=12, q2=25

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

目次に戻る, 先頭に戻る


不完全型の配列を指すポインタ

Sample list 4-7 不完全型の配列を指すポインタsample4_7.c
#include<stdio.h>

int main( void )
{
	int a[3] = { 1, 2, 3, };
	int (*p)[] = (int (*)[])a; /* 不完全型の配列を指すポインタp */

	int a1 = (*p)[0], a2 = (*p)[1], a3 = (*p)[2];

	printf( "a1=%d, a2=%d, a3=%d\n", a1, a2, a3 );

	/* p++; 不完全型なのでアドレス計算はできない */

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

% gcc sample4_7.c
% ./a
a1=1, a2=2, a3=3

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

目次に戻る, 先頭に戻る


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