函数与指针分析
文章目錄
- 1 函數(shù)類型
- 1.1 函數(shù)類型的定義
- 2 函數(shù)指針
- 2.1 函數(shù)指針的定義
- 2.2 函數(shù)指針的使用
- 2.3 回調(diào)函數(shù)
1 函數(shù)類型
1.1 函數(shù)類型的定義
函數(shù)類型:
- C語言中的函數(shù)有自己特定的類型。
- 函數(shù)的類型由返回值、參數(shù)類型和參數(shù)個數(shù)共同決定:int add(int i, int j)的類型為int(int, int)。
- C語言中通過typedef為函數(shù)類型重命名:typedef type name(parameter list):
- typedef int f(int, int);
- typedef void p(int);
2 函數(shù)指針
2.1 函數(shù)指針的定義
關(guān)于函數(shù)指針:
- 函數(shù)指針用于指向一個函數(shù)。
- 函數(shù)名是執(zhí)行函數(shù)體的入口地址。
- 可通過函數(shù)類型定義函數(shù)指針:FuncType* pointer;。
- 也可以直接定義:type(*pointer)(parameter list);
- pointer為函數(shù)指針變量名。
- type為所指函數(shù)的返回值類型。
- parameter list為所指函數(shù)的參數(shù)類型列表。
我們可以通過函數(shù)指針直接跳轉(zhuǎn)到某個固定的地址開始執(zhí)行。
2.2 函數(shù)指針的使用
/* 函數(shù)指針的定義 把函數(shù)聲明移過來,把函數(shù)名改成 (* 函數(shù)指針名) */ int (*fp)(const void *, const void *);/*貝爾實驗室的C和UNIX的開發(fā)者采用第1種形式,而伯克利的UNIX推廣者卻采用第2種形式,ANSI C 兼容了兩種方式*/ fp = &compare_int; // fp = compare_int;也是一樣的/* 第1種,按普通指針解引的放式進行調(diào)用,(*fp)等同于compare_int */ (*fp)(&x, &y); /* 第2種,直接調(diào)用 */fp(&x, &y);2.3 回調(diào)函數(shù)
回調(diào)函數(shù)的概念:
- 回調(diào)函數(shù)是利用函數(shù)指針實現(xiàn)的一種調(diào)用機制。
- 回調(diào)機制原理:
- 調(diào)用者不知道具體事件發(fā)生時需要調(diào)用的具體函數(shù)。
- 被調(diào)函數(shù)不知道何時被調(diào)用,只知道需要完成的任務(wù)。
- 當具體事件發(fā)生時,調(diào)用者通過函數(shù)指針調(diào)用具體函數(shù)。
- 回調(diào)機制中的調(diào)用者和被調(diào)函數(shù)互不依賴。
回調(diào)函數(shù)使用示例:
#include <stdio.h>typedef int(*Weapon)(int);void fight(Weapon wp, int arg) {int result = 0;printf("Fight boss!\n");result = wp(arg);printf("Boss loss: %d\n", result); }int knife(int n) {int ret = 0;int i = 0;for(i=0; i<n; i++){printf("Knife attack: %d\n", 1);ret++;}return ret; }int sword(int n) {int ret = 0;int i = 0;for(i=0; i<n; i++){printf("Sword attack: %d\n", 5);ret += 5;}return ret; }int gun(int n) {int ret = 0;int i = 0;for(i=0; i<n; i++){printf("Gun attack: %d\n", 10);ret += 10;}return ret; }int main() {fight(knife, 3);fight(sword, 4);fight(gun, 5);return 0; }參考資料:
總結(jié)
- 上一篇: 商业门面抵押贷款额度
- 下一篇: qsort()的用法