C語言指向函數的指針


定義形式:類型 (*指針變量名)(參數列表);
例如:int (*p)(int i,int j);

在這里 int是函數的返回類型,*p是指向函數的指針,(int i,int j);是函數的參數


注意 : int f(int i, int j);
int (
p)(int i, int j);
前者是返回值是指針的函數;后者是一個指向函數的指針。

示例1

#include <stdio.h>
 
#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);//或者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\n",ret);
	ret = compare(i,j,GET_MIN);
	printf("The MIN is %d\n",ret);
	return 0 ;
}

示例2 函數指針作為參數

/**
	比較兩個字符串,相等返回Equal,不相等返回Not Equal
**/
#include <stdio.h>
#include <string.h>
 
void check(char *a,char *b,int (*cmp)(const char *,const char *));
 
int main()
{
    char s1[80],s2[80];
    int (*p)(const char *,const char *);
 
	//將庫函數strcmp的地址賦值給函數指針p
    p=strcmp;
 
    printf("請輸入兩個字符串.\n");
    gets(s1);
    gets(s2);
 
    check(s1,s2,p);
    return 0;
}
 
void check(char *a,char *b,int (*cmp)(const char *,const char *))
{
    printf("Testing for equality.\n");
	//表達式(*cmp)(a,b)調用strcmp,由cmp指向庫函數strcmp(),由a和b作調用strcmp()的參數。
	//調用時,與聲明的情況類似,必須在*cmp周圍使用一對括號,使編譯程序正確操作
    if((*cmp)(a,b)==0)
        printf("Equal\n");
    else
        printf("Not Equal\n");
}

示例3


#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
 
//check()函數的第3個函數是函數指針,就可以根據具體情況傳入不同的處理函數
void check(char *a,char *b,int (*cmp)(const char *,const char *));
 
//自定義的比較兩個字符串的函數
int compvalues(const char *a,const char *b);
 
int main()
{
    char s1[80],s2[80];
    printf("輸入兩個數字或自婦產\n");
    gets(s1);
    gets(s2);
    if(isdigit(*s1)){	//如果是數字,則用函數指針傳入數字比較函數進行處理
        printf("Testing values for equality.\n");
        check(s1,s2,compvalues);
    }else{//如果是字符串,則用函數指針傳入庫函數strcmp進行處理
        printf("Testing strings for equality.\n");
        check(s1,s2,strcmp);
    }
}
 
void check(char *a,char *b,int (*cmp)(const char *,const char *))
{
    if((*cmp)(a,b)==0)
        printf("Equal.\n");
    else
        printf("Not Equal.\n");
}
 
int compvalues(const char *a,const char *b)
{
    if(atoi(a) == atoi(b))
        return 0;
    else
        return 1;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM