程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 函數指針,函數指針定義

函數指針,函數指針定義

編輯:關於C語言

函數指針,函數指針定義


1. 函數指針

1.1 函數指針:

定義:指向函數的指針,可以通過函數指針調用指向的函數

指針類型必須與指向的數據類型一致,  函數有:返回值  函數名名  參數列表

函數指針聲明: 返回值類型 (*函數指針名) (參數列表)= 函數名

函數名和數組名一樣都是地址

復制代碼
//  例1:    
       int (*p)(int a, int b) = sumValue;  // sumValue是簡單的兩個數求和函數
//  在*後面寫變量名  一定要加括號
       printf("%d\n", p(5, 8));
//  結果是:5+8=13

//  例2. 定義一個函數打印“Hello”
      void (*p) ()= printHello; // 前面是void    這個只是單純的定義
      p();   //  函數指針調用

// 例3. 定義兩個函數,一個求最⼤值,一個求和,輸⼊max或sum分別求3,5的最大值或和
      char input[] = {0};
      scanf("%s", input);
      int (*p) (int a, int b) = NULL;
      if (strcmp("sumValue", input) == 0) {
          p = sumValue;
      }
      else if(strcmp("maxValue", input) == 0)
          p = maxValue;
      printf("%d  ",p(3, 5));
// 結果是對的 你們可以自己測試一下
復制代碼

 



  1.2 回調函數:

回調函數過程:有點類似函數嵌套,但是回調函數的形參值是函數指針,通過函數指針,調用對應的函數,之後再返回函數指針的地方

例:  寫一個函數查找90分以上的學員,使用回調函數在姓名後面加“高富帥”

Student.h:

復制代碼
#import <Foundation/Foundation.h>
typedef struct student{
    char name[10];
    float score;
}Student;
void search(Student *stu, void (*p) (Student *s));
void addString(Student *s);
復制代碼
Student.m: 復制代碼
#import "Student.h"
void search(Student *stu, void (*p) (Student *)){
    if (stu->score >= 90) {
        p(stu);
    }
}
void addString(Student *s){
    strcat(s->name, "高富帥");
}
復制代碼

 


main.m : 復制代碼
int main(){
    Student stu[3] = {{"zheng", 89}, {"chen", 91}, {"fang", 94}};
    for (int i = 0; i < 3; i++) {
        search(stu+ i, addString);
        printf("%s   %.1f\n", stu[i].name, stu[i].score);
    }
    return 0;
}
復制代碼

 


結果打印:
zheng   89.0
chen高富帥   91.0
fang高富帥   94.0
Program ended with exit code: 0

 

1.3 動態排序:


復制代碼
#import <Foundation/Foundation.h>
typedef struct student{
    char name[20];
    int age;
    float score;
}Student;

#pragma mark---------------普通的冒泡排序  START--------------------
 //  學生姓名升序--------------------------------
void sortOfName(Student *stu, int count){
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (strcmp(stu[j].name, stu[j + 1].name) > 0) {
                Student temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < count; i++) {
        printf("%s,  %d,  %.1f\n", stu[i].name, stu[i].age, stu[i].score);
    }
}
//  年齡降序------------------------------
void sortOfAge(Student *stu, int count){
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (stu[j].age < stu[j + 1].age) {
                Student temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < count; i++) {
        printf("%s,  %d,  %.1f\n", stu[i].name, stu[i].age, stu[i].score);
    }
}
//  成績升序---------------------------------
void sortOfScore(Student *stu, int count){
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (stu[j].score > stu[j + 1].score) {
                Student temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < count; i++) {
        printf("%s,  %d,  %.1f\n", stu[i].name, stu[i].age, stu[i].score);
    }
}
//--------------------------------END--------------------------------

#pragma mark-------------------動態排序 START---------------------------

//兩個年齡比較大小,升序
BOOL compareAge(Student *s1, Student *s2){
    return s1->age > s2->age;
}

//兩個分數比較大小,降序
BOOL compareScore(Student *s1, Student *s2){
    return s1->score < s2->score;
}

//兩個姓名升序排序
BOOL compareName(Student *s1, Student *s2){
    return strcmp(s1->name, s2->name) > 0;
}

//兩個年齡比較大小,降序
BOOL compareAge2(Student *s1, Student *s2){
    return s1->age < s2->age;
}

typedef BOOL (*PFUN) (Student *, Student *);  //   PFUN = BOOL (*) (Student, Student) 
//  為函數指針類型起名為PFUN


void sortStudent(Student stus[], int count, PFUN pfun){  //   這個pfun就可以指向你自己封裝的各種排序方法
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (pfun(stus + j, stus + j + 1) == YES) {  //  這裡調用你寫的排序方法
                Student temp = stus[j];
                stus[j] = stus[j + 1];
                stus[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < count; i++) {
        printf("%s,  %d,  %.1f\n", stus[i].name, stus[i].age, stus[i].score);
    }
}
int main() {
    Student stu[5] = {
        {"zhang", 23, 78},
        {"zhao", 11, 89},
        {"bala", 22, 78.5},
        {"mouse", 7, 89},
        {"cat", 4, 100}
    };
//    sortOfName(stu, 5);
//    sortOfAge(stu, 5);
//    sortOfScore(stu, 5);
    PFUN p = compareAge2;
    sortStudent(stu, 5, p);
//-----------------------------------END--------------------------
     return 0;
}
復制代碼

 

1.4 函數指針做函數的返回值:

代碼實現的功能:輸入maxValue,minValue, addValue,subtractValue任意一個字符串,會實現相應代碼的功能:

復制代碼
#import <Foundation/Foundation.h>

//  四個實現取最大值,最小值,和,差的函數
int maxValue(int a, int b){
    return a > b ? a : b;
}
int minValue(int a, int b){
    return a < b ? a : b;
}
int addValue(int a, int b){
    return a + b;
}
int subtractValue(int a, int b){
    return a - b;
}

typedef int (*PFUN) (int, int); //   函數指針PFUN

typedef struct functionp{  //   結構體,成員為:name:用來存儲對應函數的名字,  func:存儲對應函數的地址
    char name[20];
    PFUN func;  // 函數指針
}Functionp;

PFUN getFunctionByName(Functionp func[], int count, char funName[]){ //  形參結構體數組func[count], 功能字符串
    for (int i = 0; i < count; i++) {
        if (strcmp(funName, func[i].name) == 0) {   //   找到對應結構體中的功能函數指針
            return func[i].func;
        }
    }
    return NULL;
    
}
int main() {
    Functionp f[4] = {
        {"maxValue", maxValue},  //功能字符串和函數指針
        {"minValue", minValue},
        {"addValue", addValue},
        {"subtractValue", subtractValue}
    };
    while (1) {
        char name[30] = {0};  //  需要輸入的功能字符串
        printf("輸入功能字符串:\n");
        scanf("%s", name);
        getchar();
        
        
        PFUN fun1 = NULL;  //  一個空的函數指針
        fun1 = getFunctionByName(f, 4, name);
        if (fun1 == NULL) {
            printf("please input again\n");
        }
        else
            printf("%s = %d  \n", name, fun1(3, 5));
    }
    return 0;
}
復制代碼

 

結果顯示:

輸入功能字符串:
maxValue
maxValue = 5  
輸入功能字符串:
addValue
addValue = 8  
輸入功能字符串:
subtractValue
subtractValue = -2  
輸入功能字符串:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved