函数指针

//// 比较两个数的大小,并返回结果

//int maxValue(int a , int b){

//    return a>b?a:b;

//}

//

//int sumNum(int x,int y){

//    return x + y;

//}

//

//void test(int a, int b){

//    

//}

//// 1- n 的和,在函数内打印

//void sum(int n){

//    int count =0;

//    for (int i =1; i<n+1; i++) {

//        count +=i;

//    }

//    printf("%d\n",count);

//}

  

int main(int argc, const char * argv[]) {

   

    //

//    Student stu1 = {20,15 ,'w', "zhangsan"};

//    Student stu2 = {21,26, 'm', "lisi"};

//    Student stu3 = {22,17, 'w', "wangwu"};

//    Student *stu =calloc(3, sizeof(Student));

//    stu[0]=stu1;

//    stu[1]=stu2;

//    stu[2]=stu3;

    

//    printf("%p\n",maxValue);

    // 定义一个函数指针

//    int (*p)(int ,int ) = NULL;// 原函数:int maxValue(int a, int b);

//    int *p = NULL;

    

    //对函数指针进行赋值

//    p = maxValue;

//    

//    // 打印地址所保存的地址

//    printf("%p\n",p);

//    

////    void (*p1)(int , int) = NULL;

//    

//    // 通过函数指针进行函数的调用

////    maxValue(10,20);

//   printf("%d\n", p(10,20));

//

//    p =sumNum;

//   printf("%d\n", p(10,20));

//    

//    void (*p)(int ) = sum ;

//  

//    p(8);

    

// 键盘输入数字,要求实现功能,1是求最大数值,2是求和,用函数指针来完成调用

//    int enterNum = 0;

//    scanf("%d",&enterNum);

//    

//    int (*p)(int, int) = NULL;

//    switch (enterNum) {

//        case 1:

//            p = maxValue;

//            printf("%d\n",p(29, 10));

//            break;

//        case 2:

//            p = sumNum;

//            printf("%d\n",p(29,10));

//            break;

//        default:

//            break;

//    }

    

      // 回调函数

    

//    int  result = maxValue3(3,6,1 ,maxValue);

//    printf("%d\n",result);   

//    char str[] ="帅";

//    printf("%ld",sizeof(str));

 

//    Student stu1 ={18 , 70.5 , 'w',"liushanshan"};

//    Student stu2 ={20 , 60 ,'w', "yanglin"};

//    Student stu3 ={21 , 95 ,'m',"zhangsan" };

//    Student stu4 ={19 ,91 ,'w', "lisi"};

//    Student stu[4] ={stu1,stu2,stu3,stu4};

//    

    //

    

//    Student newStu = changeName(stu1);

//    printf("%s\n",newStu.stuName);

    

//    checkStudent(stu, changeName);

    

//    printf("请输入排序方式,1是年龄,2是成绩,3是姓名\n");

//    int enterNum = 0;

//    scanf("%d",&enterNum);

//    // 定义函数指针的变量

//    FUN p =NULL;

//    switch (enterNum) {

//        case 1:

//            p  =sortByAge;

//            

//            break;

//        case 2:

//            p = sortByScore;

//        case 3:

//            p = sortByName;

//            break;

//        default:

//            printf("输入错误\n");

//            break;

//    }

//    bubbleSort(stu, 4, p);

//    for (int i =0; i <4 ; i++) {

//        printf("%s\n",stu[i].stuName);

//    }  

    //

//    NameFunction name1 ={"sum", sumNum};

//    NameFunction name2 ={"mul", mulNum};

//    NameFunction name3 ={"min", minNum};

//    NameFunction name[3]={name1,name2,name3};

//    

//    // 调用一下下

//    PFUN p = checkFunctionName(name,"sum");

//    if (p == NULL) {

//        printf("功能不对\n");

//    }else{

//        printf("%d\n",p(3,5));

//    }

    return 0;

}

. h函数

//  Myfunction.h

//  C12_函数指针

//

//  Created by dllo on 15/7/14.

//  Copyright (c) 2015年 cml. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

// 找到两个数中最大值

//int maxValue(int a,int b );

//

//// 三个数最大值

//// 函数调回时候,需要把调用的函数作为第四个参数,然后针对地址进行调用

//int  maxValue3(int a,int b,int c ,int (*p)(int,int));

//// 四个数中最大值

//

//// 声明学生类型的结构体

//

//struct student{

//    int stuAge;

//    float stuScore;

//    

//    char stuSex;

//    char stuName[50];

//};

//typedef struct student Student;

//

////  回调部分的函数

//

//Student changeName(Student stu);

//

//// 用来查找90分以上的学生,满足条件的调用改名的函数进行名的拼接

//

//void checkStudent(Student stu[],Student (*p)(Student ));

//

//// 动态排序

//

//// 先写三个排序条件

//

//// 按照年龄排序

//BOOL sortByAge(Student stu1,Student stu2);

//// 分数

//BOOL sortByScore(Student stu1,Student stu2);

//// 姓名

//BOOL sortByName(Student stu1,Student stu2);

//

//

//typedef BOOL(*FUN)(Student,Student) ;

//void bubbleSort(Student stu[],int count ,FUN p);

 

 

// 函数的返回值是函数指针

int sumNum(int a, int b);

int mulNum(int a, int b);

int minNum(int a, int b);

// PFUN是新类型

typedef int(*PFUN) (int ,int );

 

// 让功能名和地址能关联起来,为他们下一个结构体,一个存名,一个存对应功能的地址

 

struct nameFunction{

    char name[20];    // 功能名

    PFUN p;           // 对应的功能名地址

};

typedef struct nameFunction NameFunction;

 

// 通过功能的名,找到对应功能的函数地址,返回函数地址

 

PFUN checkFunctionName(NameFunction name[],char str[]);

 

.m函数

//  Myfunction.m

//  C12_函数指针

//

//  Created by dllo on 15/7/14.

//  Copyright (c) 2015年 cml. All rights reserved.

//

 

#import "Myfunction.h"

 

 

//// 找到两个数中最大值

//int maxValue(int a,int b ){

//    return a>b?a:b;

//}

//

//

//

//int  maxValue3(int a,int b,int c ,int (*p)(int,int)){

//    

//

//// 函数的嵌套调用

//

////    int max =maxValue(a, b);

//// 回调函数

//    int max = p(a,b);

//    max =p(max ,c);

//    return max;

//

//}

//

//Student changeName(Student stu){

//    // 字符串的拼接

//    strcat(stu.stuName, "高富帅");

//    return stu;

//    

//}

//

//void checkStudent(Student stu[],Student (*p)(Student )){

//    

//    // 进行for循环的遍历

//    for (int i =0; i<4; i++) {

//        if (stu[i].stuScore>=90) {

//            p(stu[i]);

//            stu[i ] = p(stu[i]);

//            // 打印一下新的学生姓名

//            printf("%s\n",stu[i].stuName);

//        }

//    }

//

//    

//}

//// 按照年龄排序

//BOOL sortByAge(Student stu1,Student stu2){

//    

//    

//    

//    return stu1.stuAge>stu2.stuAge?YES:NO;

//}

//

//

//// 分数

//BOOL sortByScore(Student stu1,Student stu2){

//    return stu1.stuScore>stu2.stuScore?YES:NO;

//    

//}

//

//

//// 姓名

//BOOL sortByName(Student stu1,Student stu2){

//   return  strcmp(stu2.stuName, stu2.stuName)>0?YES:NO;

//}

//

//

//void bubbleSort(Student stu[],int count ,FUN p){

//    for (int i =0; i<count -1; i++) {

//        for (int j =0; j< count -1-i; j++) {

//            // 指定排序依据

//            if (p(stu[j],stu[j + 1])) {

//                // 交换

//                Student temp =stu[j];

//                stu[j]=stu[j+1];

//                stu[j+1]=temp;

//                

//            }

//        }

//    }

//}

 

int sumNum(int a, int b){

    return a+b;

}

int mulNum(int a, int b){

    return a*b;

}

int minNum(int a, int b){

    return a-b;

}

 

PFUN checkFunctionName(NameFunction name[],char str[]){

    for (int i=0; i<3; i++  ) {

        if (strcmp(name[i].name,str)==0) {

            return name[i].p;

        }

    }

    return NULL;

}

 

posted @ 2015-07-14 21:02  天涯ml  阅读(185)  评论(0编辑  收藏  举报