関数へのポインタ-----関数ポインタ(function pointer)

3000 ワード

関数にはポインタに値を割り当てることができる物理メモリアドレスがあり、関数の関数名はポインタであり、関数のコードを指します.1つの関数のアドレスは、その関数のエントリポイントであり、関数を呼び出すアドレスでもある.関数の呼び出しは、関数名または関数へのポインタで呼び出すことができます.関数ポインタを使用すると、関数を変数として他の関数に渡すこともできます.
カッコと変数リストを持たない関数名は、下付き配列名を持たずに配列の最初のアドレスを表すことができるように、関数のアドレスを表すことができます.
定義:
タイプ(*ポインタ変数名)(パラメータリスト)
例:
        int (*p)(int i,int j);
pは、2つの整形パラメータを持つ関数を指すポインタであり、戻りタイプはintである.pはまず*と結合し,pがポインタであることを示した.次に()と結合し,それが関数を指すことを示した.関数を指すポインタは、関数ポインタとも呼ばれます.
例1:
#include 

#define  GET_MAX 	0
#define  GET_MIN 	1

int get_max(int i,int j)
{
	return i>j?i:j;
}

int get_min(int i,int j)
{
	return i>j?j:i;
}

int compare(int i,int j,int flag)
{
	int ret;

	//           ,        flag,                   
	//             
	int (*p)(int,int);

	if(flag == GET_MAX)
		p = get_max;
	else
		p = get_min;

	ret = p(i,j);

	return ret;
}

int main()
{
	int i = 5,j = 10,ret;

	ret = compare(i,j,GET_MAX);
	printf("The MAX is %d
",ret); ret = compare(i,j,GET_MIN); printf("The MIN is %d
",ret); return 0 ; }

例2:
#include 
#include 

void check(char *a,char *b,int (*cmp)(const char *,const char *));

main()
{
    char s1[80],s2[80];
    int (*p)(const char *,const char *);

	//    strcmp          p
    p=strcmp;

    printf("Enter two strings.
"); gets(s1); gets(s2); check(s1,s2,p); } void check(char *a,char *b,int (*cmp)(const char *,const char *)) { printf("Testing for equality.
"); // (*cmp)(a,b) strcmp, cmp strcmp(), a b strcmp() 。 // , , *cmp , , // , , 。 if((*cmp)(a,b)==0) printf("Equal
"); else printf("Not Equal
"); }

例3:
#include 
#include 
#include 
#include 

//check()    3        ,                  
void check(char *a,char *b,int (*cmp)(const char *,const char *));

//              
int compvalues(const char *a,const char *b);

main()
{
    char s1[80],s2[80];

    printf("Enter two values or two strings.
"); gets(s1); gets(s2); // , if(isdigit(*s1)){ printf("Testing values for equality.
"); check(s1,s2,compvalues); } // , strcmp else{ printf("Testing strings for equality.
"); check(s1,s2,strcmp); } } void check(char *a,char *b,int (*cmp)(const char *,const char *)) { if((*cmp)(a,b)==0) printf("Equal.
"); else printf("Not Equal.
"); } int compvalues(const char *a,const char *b) { if(atoi(a)==atoi(b)) return 0; else return 1; }

注意:
        int *f(int i, int j);
        int (*p)(int i, int j);
前者は戻り値がポインタの関数である.後者は関数を指すポインタです.