C言語 入門 小学生でもわかるC言語2

十三日目 関数ポインタ

「わかりやすく!」がテーマです!

HOME/小学生でもわかるC言語2 目次/十三日目 関数ポインタ/

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2016/5/10 22:16時点)

もっと!C、C++言語本

目次へ戻る

?と思ったら

わからなそうな用語集

関数ポインタ

変数にポインタがあるように、構造体にもポインタがあるように、関数にもポインタがあります!

使い方

変数でポインタを使う時は、

int suji;

この先頭に「*」アスタリスクをつけて

int *suji_p;

ポインタ変数に変わるのでした!

関数ポインタも基本は変わりません。

まずは普通の関数を作りましょう!

void func(void);

何も受け渡しがない関数「func」ですね!

このカタチをそのままポインタにしていきます!

という事はどこかの先頭に「*」アスタリスクをつけるワケですね!

void (*func_p)(void);

「func」の先頭に「*」アスタリスクがつきます!

そして計算の順序が変わらないように()カッコで→(*func)囲みます!

そしてその後ろの「void」は省略できるので、

void (*func_p)();

ここに関数ポインタを保存する時は

void (*func_p)() = func;

このように保存します。

今回は「&」アンパサンドは付きません。

使う時は

(*func_p)();

これで使います。

ここは関数ポインタという事をわかりやすくするタメに()カッコで「func」を囲みます!

まとめてプログラム

/*プログラム43*/
#include <stdio.h>

void func(void);

int main(){
	void (*func_p)() = func;
	(*func_p)();

	return 0;
}

void func(){
	printf("関数ポインタの巻\n");
}

■実行結果■

実行結果(e-13-1)

プロトタイプ宣言

void func(void);

関数ポインタに保存

void (*func_p)() = func;

使う時

(func_p)();

この流れを覚えましょう!

関数ポインタを通して数字を受け渡しする

ここもキホンは変わりません。

「int menseki(int,int)」

関数の所で学んだ四角形の面積を求める関数「menseki」を関数ポインタで扱ってみましょう!

プロトタイプ宣言

int menseki(int ,int );

ここは変わらないですね!

ではこれを関数ポインタに入れてみます!

void (*func_p)() = func;

受け渡しが何もない時は「void」でしたね!

これを受け渡しする「int」に変えます。

int (*menseki_p)(int ,int ) = menseki;

先頭に「*」アスタリスクがついて()カッコで囲みます!

そして使う時はやっぱり、

kotae = (*menseki)(10,5);

()カッコで囲んで使います!

再びプログラミング

/*プログラム44*/
#include <stdio.h>

int menseki(int ,int);

int main(){
	int kotae = 0;
	int (*menseki_p)(int ,int ) = menseki;

	kotae = (*menseki_p)(10,5);

	printf("長さ縦10,横5の四角形の面積 = %d\n",kotae);

	return 0;
}

int menseki(int tate,int yoko){
	return tate * yoko;
}

■実行結果■

実行結果(e-13-2)

関数ポインタを使うと

kotae = (*menseki_p)(10,5);

このように余計?な()カッコがどんどん増えてくるので、一つずつしっかり覚えましょう!

例えば配列にできます

関数ポインタを使って関数を配列にしてみましょう!

/*プログラム45*/
#include <stdio.h>

void ohayo(void);
void konnitiha(void);
void konbanha(void);

int main(){
	int i;
	void (*aisatu[3])() = {ohayo,konnitiha,konbanha};
	
	for(i=0;i<3;i++){
		(*aisatu[i])();
	}

	return 0;
}

void ohayo(){
	printf("おはよう!\n");
}

void konnitiha(){
	printf("こんにちは!\n");
}

void konbanha(){
	printf("こんばんは!\n");
}

■実行結果■

実行結果(e-13-3)

配列にすれば「for」命令などでまとめて使えるので便利ですね!

void (*aisatu[3])() = {ohayo,konnitiha,konbanha};

(*aisatu[3])ここに配列の番号がきます!

()カッコの多さにまどわされないようにしましょう!

次回は乱数(らんすう)と時間についてやっていきたいと思います。

次回

最終日 乱数(らんすう)と時間

□ページの先頭へ□

□目次へ戻る□

広告

↓2014年06月20日発売↓

14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編

新品価格
¥2,500から
(2016/5/10 22:17時点)

↓2014年10月25日発売↓

超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室

新品価格
¥3,110から
(2016/5/10 22:18時点)

↓2013年07月25日発売↓

小学生からはじめるわくわくプログラミング

新品価格
¥2,052から
(2016/5/10 22:21時点)

↓2016年05月13日発売↓

小学生からはじめるわくわくプログラミング2

新品価格
¥2,052から
(2016/5/10 22:22時点)

もっと!C、C++言語本