函數指針


#import <Foundation/Foundation.h>

//int(*)(int ,int) 原類型
//PFUN 新類型
typedef int(*PFUN)(int ,int);



typedef struct student{
   
char name[20];
   
char sex;
   
int age;
   
float score;
}STUDENT;


BOOL sortByAge(STUDENT stu, STUDENT stu1);
BOOL sortByAge(STUDENT stu, STUDENT stu1){
   
return stu.age > stu1.age;
}
BOOL sortByName(STUDENT stu, STUDENT stu1);
BOOL sortByName(STUDENT stu, STUDENT stu1){
   
return strcmp(stu.name, stu1.name) > 0;
}
BOOL sortByscore(STUDENT stu, STUDENT stu1);
BOOL sortByscore(STUDENT stu, STUDENT stu1){
   
return stu.score > stu1.score;
}
//把姓名後加高富帥(回調函數)
void sortByscoreGood(STUDENT * stu);
void sortByscoreGood(STUDENT * stu){
      
strcat((*stu).name, "高富帥");
}
//分數加5
void sortByscoreAdd(STUDENT * stu);
void sortByscoreAdd(STUDENT * stu){
    (*stu).
score += 5;
   
if ((*stu).score >= 100) {
        (*stu).
score = 100;
    }
}

//查找成績 > 90
typedef void (*SO)(STUDENT * stu);

void checkStudentsScore(STUDENT * stu, int count,SO p);
void checkStudentsScore(STUDENT * stu, int count,SO p){
   
for (int i = 0; i < count; i++) {
       
if ((*(stu + i)).score > 90) {
           
//回調
            p(stu + i);
        }
    }

}

//回調函數的核心就是函數指針當作函數的參數
typedef BOOL (*SORTP)(STUDENT,STUDENT);
void sortOfStudent(STUDENT * stus,int count,SORTP p);
void sortOfStudent(STUDENT * stus,int count,SORTP p){
   
BOOL needNext = YES;
   
for (int i = 0; i < count - 1 && needNext == YES; i++) {
        needNext =
NO;
       
for (int j = 0; j < count - 1 - i; j++) {
           
if (p(stus[j],stus[j + 1])) {
                needNext =
YES;
               
STUDENT tem = (*(stus + j));
                (*(stus + j)) = (*(stus + j +
1));
                (*(stus + j +
1)) = tem;
            }
        }
    }
}

void printOf(STUDENT * stus,int count);
void printOf(STUDENT * stus,int count){
   
for (int i = 0; i < count; i++){
       
printf("%10s %c %d %.2f\n",(*(stus + i)).name,(*(stus + i)).sex,(*(stus + i)).age,(*(stus + i)).score);
    }
}


int maxValue(int a, int b);
int maxValue(int a, int b){
   
return a > b ? a : b;
}
int sumValue(int a, int  b);
int sumValue(int a, int  b){
   
return a + b;
}
int minus(int a, int b);
int minus(int a, int b){
   
return a - b;
}
int product(int a, int b);
int product(int a, int b){
return a * b;
}
//typedef int(*PFUN)(int ,int);
int printValue(int a, int b, PFUN p);
int printValue(int a, int b, int (*p)(int, int)){
   
//回調
   
return p(a, b);
}

void printHello();
void printHello()
{
   
printf("hello");
}



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

//函數編譯完成也會被存儲,存儲在內存的代碼區
//函數名是函數在代碼區的首地址
//    printf("%p",maxValue);
   
//0x100000f00[代碼區]
   
   
//int (*)(int a, int b)指針的類型
   
//p 指針的變量名
//    int (*p)(int a, int b) = maxValue;
//    //使用函數指針調用函數
//    int result = p(10, 15);
//    printf("result = %d",result);
   
   
//指針變量p能夠指向有一個整形返回值,兩個整形參數的函數
//    int (*p)(int a, int b) = sumValue;
//    int result = p(5, 6);
//    printf("%d",result);
   
   
//空類型的指針
//定義一個可以指向上述函數的函數指針,並通過函數指針實現調用該函數。
//    void (*p)() = printHello;
//    p();
   
//定義兩個函數,一個求最大值,一個求和,輸入maxsum分別求3,5的最大值或和(提示,定義一個函數指針,根據輸入內容指向不同函數,最後一次調用完成)
//    int a = 3, b = 5;
//    int (*p)(int a, int b) = NULL;
//    printf("請輸入你要求的內容:");
//    char inputStr[20] = {0};
//    scanf("%s",inputStr);
//    if (strcmp(inputStr, "max") == 0) {
//        p = maxValue;
//    }else if(strcmp(inputStr, "sum") == 0){
//        p = sumValue;
//    }else {
//        printf("你輸入的錯誤!");
//        //return 0;//提前結束
//        exit(0);//結束程序
//    }
//    int result  = p(a, b);
//    printf("%d",result);
   
   
//回調函數(CallBack)是指由調用方自己實現,
   
//設計模式[高內聚,低耦合]
//    int a = 5, b = 10;
//    int result = printValue(a, b, product);
//    printf("result = %d",result);
   
//    STUDENT stu[5] = {
//        {"zhangshan",'M',24,89.6},
//        {"yangzi",'W',23,81.22},
//        {"huangshang",'M',26,88.1},
//        {"shangwen",'W',22,79.52},
//        {"wenshang",'M',25,98.01}
//    };
////    sortOfStudent(stu, 5,sortByscore);
//    checkStudentsScore(stu, 5 , sortByscoreAdd);
//    printOf(stu,5);
   
   
return 0
;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章