ディレクトリ
定義された関数ポインタ
メモリアドレス内の関数もあります。
#include <stdio.h>
void fun()
{
printf("hello, world\r\n");
}
int main(int argc, char* argv[])
{
printf("%p\r\n", fun);
return 0;
}
アドレスので、ポインタと呼ばれる(最初の)アドレスポインタ、記憶機能に記憶されたアドレスを変更するように定義することができる関数ポインタ。
定義されたいくつかの特別な関数ポインタは、例えば、定義するために指すことができ、戻り値intを、int型のパラメータは、関数があるポインタは、次の文を:
#include <stdio.h>
int fun(int arg)
{
printf("hello, world\r\n");
}
int main(int argc, char* argv[])
{
int(*pfn)(int) = NULL;
pfn = fun;
return 0;
}
関数ポインタの宣言は、以下の手順によって達成することができます。
- 目的関数の最初のプロトタイプを書きます
- 目的関数は、関数名は、ポインタ変数名を機能するように変更されました
- 「*」印名や関数名として括弧で囲ま
関数ポインタの複雑さ
私たちはその機能が定義されている場合は、想像して引数の関数であるが、戻り値は、関数でプロトタイプされています。
- パラメータ:なしパラメータ、戻り値なし
- 戻り値:値の戻りint型とパラメータのint
次のコードに似て、最終的な完了の文:
#include <stdio.h>
#include <signal.h>
void FunArg()
{
printf("我是没有参数没有返回值的函数\r\n");
}
int FunReturn(int arg)
{
printf("我是int参数,int返回值的函数\r\n");
return 0;
}
int(*MyFunction(void (* pArg)(void) ))(int)
{
printf("我是参数及返回值都是函数的函数\r\n");
return FunReturn;
}
int main(int argc, char* argv[])
{
MyFunction(FunArg);
return 0;
}
C言語の関数ポインタ変数名は非常に終わりはないので、組み合わせ関数ポインタ型なので、それは非常に奇妙です。
簡単にするために、我々は、typedefの構文を使用することができます。
typedef
typedefが、我々はtypedefをを使用することができ、エイリアスを宣言するキーワードである別名のタイプ。
基本的な構文は次のとおりです。
typedef <原类型名> <新别名>
新しい別名の効果と元としての効果の種類
typedef int MYINT;
int main(int argc, char* argv[])
{
MYINT value = 5;
return 0;
}
コードの可読性を高めることができるのtypedefを使用してください。
特に、関数ポインタのため、別名から関数ポインタが一意である、それはノーいわゆる元の型の名前を持つ、別名識別子がtypedefをした後、新たなソリューションである、例えば、私たちの前にコードを簡素化するためのtypedefを使用します。
#include <stdio.h>
#include <signal.h>
void FunArg()
{
printf("我是没有参数没有返回值的函数\r\n");
}
int FunReturn(int arg)
{
printf("我是int参数,int返回值的函数\r\n");
return 0;
}
typedef void(*PFN_ARG)(void);
typedef int(*PFN_RETURN)(int);
PFN_RETURN MyFunction(PFN_ARG arg)
{
printf("我是参数及返回值都是函数的函数\r\n");
return FunReturn;
}
int main(int argc, char* argv[])
{
MyFunction(FunArg);
return 0;
}
機能を正確に前と同じようにコードが、はるかに強化さ読みやすさ。