関数ポインタ
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
*関数ポインタ [#qc4fde79]
>
C/C++でプログラムを書いているとき関数を入れる変数や配列が...
実は関数ポインタを使うとほぼ同等のことが出来ます。~
**関数ポインタとは [#k23be939]
>
プログラム実行時、変数や関数はコンピュータのメモリ上に配...
~
&変数名
~
これが変数のアドレスを取得する方法です。scanf関数などで使...
関数のアドレスを取得も同じです。~
~
&関数名
~
アドレスを取得したらそれを入れる変数が必要になります。変...
~
int num = 10;
int *pVar = # // pVarという名前のポインタを宣言し、...
*pVar = 20; // pVarを介してnumに20を代入する
~
同様に関数のアドレスを入れる変数があります。それが今回の...
ポインタと関数ポインタは区別して使い分けてるので注意して...
**使用例 [#ubbfdb8e]
>
関数ポインタの例をあげます。~
~
double AAA(int a) {
return a;
}
double (*pFunc)(int) = &AAA; // pFuncという名前の関数ポ...
double d = (*pFunc)(30); // pFuncを介してAAA(30)が...
~
宣言が複雑ですね。ポインタのときポインタが指す変数の型を...
関数の型はその関数の引数と戻値で表されます。引数の型・数...
(ここでは"関数の型"と表現しましたが、一般には関数の引数...
上の例ではpFuncは『int型の引数を1つ取り、doubleを返す』...
''(''*pFunc'')''の括弧を忘れて~
~
double *pFunc(int);
~
とすると『int型の引数を1つ取り、''doubleへのポインタ''を...
ちなみに関数のアドレスを取得するときの&と、関数ポインタを...
~
double AAA(int a) {
return a;
}
double (*pFunc)(int) = AAA; // pFuncという名前の関数ポ...
double d = pFunc(30); // pFuncを介してAAA(30)が実行...
~
これは上記の例と同じです。僕はこっちの方が直感的だしタイ...
**関数ポインタの配列 [#y627ca72]
>
ではポインタ配列と関数ポインタの配列の例を見てみましょう。~
~
int *pVarArray[4]; // ポインタの配列
double (*pFuncArray[4])(int); // 関数ポインタの配列
pFuncArray[0] = AAA;
double d = pFuncArray[0](40);
~
これで関数を変えながらのループなどができますね。~
さて、ポインタには『ポインタへのポインタ』というのがあり...
~
double (**ppFunc)(int) = &pFunc;
double d = (*ppFunc)(50);
~
あくまでも『int型1つを引数に取り、doubleを返す関数ポイン...
**typedefで名前をつける [#ze266700]
>
関数ポインタでややこしいのは宣言だと思います。なのでtyped...
~
typedef void (*HOGE)(int,int); // int型の引数を2つ取り...
HOGE hoge; // void (*hoge)(int,int)...
HOGE hogeArray[8]; // HOGE型の配列
HOGE *pHoge; // HOGE型へのポインタ
~
ずいぶん簡単になりました。ソースコードの可読性のためにも...
**関数を引数に持つ関数 [#i66acbdd]
>
正確には関数ポインタを引数に持つ関数を作ることもできます...
~
void Foo(int x,HOGE h) { ←int型1つとHOGE型1つの引数...
h(x,60);
}
~
のような感じです。とても柔軟性があり、ダイナミックな処理...
実際にC言語標準ライブラリにはqsort関数やbsearch関数のよう...
例としてqsort関数の使い方をあげておきます。~
qsort関数は配列内の要素を比較関数を用いて並び替えます。並...
~
#include <stdio.h>
#include <stdlib.h> /* qsort関数 */
int comp(const int* a,const int* b) { /* int型変数を...
return *a - *b;
}
void main() {
int i;
int a[10] = { 12 , 64 , 34 , 11 , 5 , 82 , 4 , 99 , ...
typedef int (*COMP)(const void*,const void*);
qsort(a,10,sizeof(int),(COMP)comp);
for ( i = 0 ; i < 10 ; ++i ) {
printf("%d\n",a[i]);
}
}
>
/* 他のデータも同様
typedef struct Point {
int x,y;
} Point;
int compPointX(const Point* p,const Point* q) { /* Poin...
return p->x - q->x;
}
~
qsort関数の第3引数とcomp関数のシグネチャ(関数の型)が違...
他にもコールバック関数という仕組みは関数ポインタが用いら...
**構造体に関数を持たせる [#bd98ea76]
>
C言語でC++のクラスもどきを作ってみましょう。と言っても継...
~
struct Player;
typedef void (*MOVE)(struct Player*,int,int);
typedef void (*DRAW)(struct Player*);
typedef struct Player {
int x,y;
MOVE move;
DRAW draw;
} Player;
void MovePlayer(Player* this,int dx,int dy) { /* C++だ...
this->x += dx; this->y += dy;
}
void DrawPlayer(Player* this) {
/* 描画処理 */
}
void main() {
Player player = {0,0,MovePlayer,DrawPlayer};
player.move(&player,10,20);
player.draw(&player);
}
~
ポリモーフィズム(多相性)的なことができますね。
**感想・質問・要望・間違いの指摘など [#ff574995]
>
何かあればお気軽にどうぞ。~
- すばらしいです。ようやく関数ポインタのtypedefが理解でき...
- 関数ポインタってすでに関数がコールされてる状態なの? --...
- 関数のアドレスを関数ポインタに代入するだけでは関数はコ...
#comment
終了行:
*関数ポインタ [#qc4fde79]
>
C/C++でプログラムを書いているとき関数を入れる変数や配列が...
実は関数ポインタを使うとほぼ同等のことが出来ます。~
**関数ポインタとは [#k23be939]
>
プログラム実行時、変数や関数はコンピュータのメモリ上に配...
~
&変数名
~
これが変数のアドレスを取得する方法です。scanf関数などで使...
関数のアドレスを取得も同じです。~
~
&関数名
~
アドレスを取得したらそれを入れる変数が必要になります。変...
~
int num = 10;
int *pVar = # // pVarという名前のポインタを宣言し、...
*pVar = 20; // pVarを介してnumに20を代入する
~
同様に関数のアドレスを入れる変数があります。それが今回の...
ポインタと関数ポインタは区別して使い分けてるので注意して...
**使用例 [#ubbfdb8e]
>
関数ポインタの例をあげます。~
~
double AAA(int a) {
return a;
}
double (*pFunc)(int) = &AAA; // pFuncという名前の関数ポ...
double d = (*pFunc)(30); // pFuncを介してAAA(30)が...
~
宣言が複雑ですね。ポインタのときポインタが指す変数の型を...
関数の型はその関数の引数と戻値で表されます。引数の型・数...
(ここでは"関数の型"と表現しましたが、一般には関数の引数...
上の例ではpFuncは『int型の引数を1つ取り、doubleを返す』...
''(''*pFunc'')''の括弧を忘れて~
~
double *pFunc(int);
~
とすると『int型の引数を1つ取り、''doubleへのポインタ''を...
ちなみに関数のアドレスを取得するときの&と、関数ポインタを...
~
double AAA(int a) {
return a;
}
double (*pFunc)(int) = AAA; // pFuncという名前の関数ポ...
double d = pFunc(30); // pFuncを介してAAA(30)が実行...
~
これは上記の例と同じです。僕はこっちの方が直感的だしタイ...
**関数ポインタの配列 [#y627ca72]
>
ではポインタ配列と関数ポインタの配列の例を見てみましょう。~
~
int *pVarArray[4]; // ポインタの配列
double (*pFuncArray[4])(int); // 関数ポインタの配列
pFuncArray[0] = AAA;
double d = pFuncArray[0](40);
~
これで関数を変えながらのループなどができますね。~
さて、ポインタには『ポインタへのポインタ』というのがあり...
~
double (**ppFunc)(int) = &pFunc;
double d = (*ppFunc)(50);
~
あくまでも『int型1つを引数に取り、doubleを返す関数ポイン...
**typedefで名前をつける [#ze266700]
>
関数ポインタでややこしいのは宣言だと思います。なのでtyped...
~
typedef void (*HOGE)(int,int); // int型の引数を2つ取り...
HOGE hoge; // void (*hoge)(int,int)...
HOGE hogeArray[8]; // HOGE型の配列
HOGE *pHoge; // HOGE型へのポインタ
~
ずいぶん簡単になりました。ソースコードの可読性のためにも...
**関数を引数に持つ関数 [#i66acbdd]
>
正確には関数ポインタを引数に持つ関数を作ることもできます...
~
void Foo(int x,HOGE h) { ←int型1つとHOGE型1つの引数...
h(x,60);
}
~
のような感じです。とても柔軟性があり、ダイナミックな処理...
実際にC言語標準ライブラリにはqsort関数やbsearch関数のよう...
例としてqsort関数の使い方をあげておきます。~
qsort関数は配列内の要素を比較関数を用いて並び替えます。並...
~
#include <stdio.h>
#include <stdlib.h> /* qsort関数 */
int comp(const int* a,const int* b) { /* int型変数を...
return *a - *b;
}
void main() {
int i;
int a[10] = { 12 , 64 , 34 , 11 , 5 , 82 , 4 , 99 , ...
typedef int (*COMP)(const void*,const void*);
qsort(a,10,sizeof(int),(COMP)comp);
for ( i = 0 ; i < 10 ; ++i ) {
printf("%d\n",a[i]);
}
}
>
/* 他のデータも同様
typedef struct Point {
int x,y;
} Point;
int compPointX(const Point* p,const Point* q) { /* Poin...
return p->x - q->x;
}
~
qsort関数の第3引数とcomp関数のシグネチャ(関数の型)が違...
他にもコールバック関数という仕組みは関数ポインタが用いら...
**構造体に関数を持たせる [#bd98ea76]
>
C言語でC++のクラスもどきを作ってみましょう。と言っても継...
~
struct Player;
typedef void (*MOVE)(struct Player*,int,int);
typedef void (*DRAW)(struct Player*);
typedef struct Player {
int x,y;
MOVE move;
DRAW draw;
} Player;
void MovePlayer(Player* this,int dx,int dy) { /* C++だ...
this->x += dx; this->y += dy;
}
void DrawPlayer(Player* this) {
/* 描画処理 */
}
void main() {
Player player = {0,0,MovePlayer,DrawPlayer};
player.move(&player,10,20);
player.draw(&player);
}
~
ポリモーフィズム(多相性)的なことができますね。
**感想・質問・要望・間違いの指摘など [#ff574995]
>
何かあればお気軽にどうぞ。~
- すばらしいです。ようやく関数ポインタのtypedefが理解でき...
- 関数ポインタってすでに関数がコールされてる状態なの? --...
- 関数のアドレスを関数ポインタに代入するだけでは関数はコ...
#comment
ページ名: