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

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

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

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

目次に戻る


第2章 派生型の復習

内容
Sample list 2-1 ポインタのポインタのポインタ
Sample list 2-2 配列を指すポインタ(基本版)
Sample list 2-3 配列を指すポインタ(応用版)
Sample list 2-4 ポインタ配列
Sample list 2-5 ポインタ配列の応用例

ポインタのポインタのポインタ

Sample list 2-1 ポインタのポインタのポインタsample2_1.c
#include<stdio.h>

int main( void )
{
	int p0 = 12345;
	int *p1; /* ポインタ */
	int **p2; /* ポインタのポインタ */
	int ***p3; /* ポインタのポインタのポインタ */
	int t1, t2, t3;
	
	p1 = &p0; /* 「int型のオブジェクト」のアドレスを「ポインタ」にセット */
	p2 = &p1; /* 「ポインタ」のアドレスを「ポインタのポインタ」にセット */
	p3 = &p2; /* 「ポインタのポインタ」のアドレスを「ポインタのポインタのポインタ」にセット */

	t1 = *p1; /* 「ポインタ」の指しているオブジェクトの値をt1にセット */
	t2 = **p2; /* 「ポインタのポインタ」の指しているオブジェクトの値をt2にセット */
	t3 = ***p3; /* 「ポインタのポインタのポインタ」の指しているオブジェクトの値をt3にセット */

	printf( "t1=%d, t2=%d, t3=%d\n", t1, t2, t3 );

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

% gcc sample2_1.c
% ./a
t1=12345, t2=12345, t3=12345

目次に戻る, 先頭に戻る


配列を指すポインタ(基本版)

Sample list 2-2 配列を指すポインタ(基本版)sample2_2.c
#include<stdio.h>

int main( void )
{
	int t[3] = { 1, 2, 3, };
	int (*p)[3]; /* 「要素を3つ持つ1次元配列」へのポインタ */
	int t1;

	p = &t; /* 「要素を3つ持つ1次元配列」のアドレスをpにセット */

	t1 = (*p)[1]; /* 「要素を3つ持つ1次元配列」のポインタが指している配列の1つめ(実際には2つめ)の要素 */

	printf("t1=%d\n", t1 );

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

% gcc sample2_2.c
% ./a
t1=2

目次に戻る, 先頭に戻る


配列を指すポインタ(応用版)

Sample list 2-3 配列を指すポインタ(応用版)sample2_3.c
#include<stdio.h>

int main( void )
{
	int a[2][3][4] = 
		{ 
			{ {  1, 2, 3, 4, }, {  5, 6, 7, 8, }, {  9,10,11,12, }, },
			{ { 13,14,15,16, }, { 17,18,19,20, }, { 21,22,23,24, }, }
		};

	int *b; /* = int型のオブジェクトを指すポインタ */
	int (*c)[4]; /* = 4個の要素(int型)を持つ配列を指すポインタ */
	int (*d)[3][4]; /* = 3×4個の要素(int型)を持つ配列を指すポインタ */

	int a1, a2, a3;

	b = a[1][2]; /* a[1][2]={21,22,23,24,}の配列の先頭アドレスをbにセット */
	c = a[1]; /* a[1]={{13,14,15,16,},{17,18,19,20,},{21,22,23,24,}}の配列の先頭アドレスをcにセット */
	d = a; /* 3次元配列aを指すアドレスをdにセット */

	a1 = b[3]; /* = a[1][2][3] */
	a2 = c[1][2]; /* = a[1][1][2] */
	a3 = d[0][1][2]; /* = a[0][1][2] */

	printf( "a[1][2][3] = %d\n", a[1][2][3] );
	printf( "a1=%d, a2=%d, a3=%d\n", a1, a2, a3 );

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

% gcc sample2_3.c
% ./a
a[1][2][3] = 24
a1=24, a2=19, a3=7

目次に戻る, 先頭に戻る


ポインタ配列

Sample list 2-4 ポインタ配列sample2_4.c
#include<stdio.h>

int main( void )
{
	int k1=1, k2=2, k3=3;
	int *p[3] = { &k1, &k2, &k3, };
	int t;

	for( t=0; t<3; t++ )
	{
		int value = *p[t];

		printf( "value=%d\n", value );
	}

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

% gcc sample2_4.c
% ./a
value=1
value=2
value=3

目次に戻る, 先頭に戻る


ポインタ配列の応用例

Sample list 2-5 ポインタ配列の応用例sample2_5.c
#include<stdio.h>

int main( void )
{
	int k;
	char *mes[] = { "one", "two", "three", (char *)NULL, };

	for( k=0; mes[k]; k++ )
	{
		printf( "mes=%s, ", mes[k] );
	}

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

% gcc sample2_5.c
% ./a
mes=one, mes=two, mes=three,

目次に戻る, 先頭に戻る


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