C言語ワンポイント講座ポインタと派生型徹底入門 サンプルプログラム集コンピュータを学習する人の学校:パソコンキャンパス、プログラミングキャンパス |
ここでは、 The Office Uchida, School of Computerの e-Learningシステム 「C言語ワンポイント講座 ポインタと派生型入門」のためのサンプルプログラムを紹介しています。
この中に記載されているプログラムをブラウズあるいはカットアンドペーストしてください。
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
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