C语言学习笔记--函数与指针
1. 函數(shù)類型
(1)C 語言中的函數(shù)有自己特定的類型,這個(gè)類型由返回值、參數(shù)類型和參數(shù)個(gè)數(shù)共同決定。如 int add(int i,int j)的類型為 int(int,int)。
(2)C 語言中通過 typedef 為函數(shù)類型重命名
? ??typedef type name(parameter list);//如 typedef int f(int,int);
2. 函數(shù)指針
(1)函數(shù)指針用于指向一個(gè)函數(shù),函數(shù)名是執(zhí)行函數(shù)體的入口地址。
(2)定義函數(shù)指針的兩種方法
? ? ①通過函數(shù)類型定義:FuncType* pointer;
? ? ②直接定義:type(*pointer)(parameter list);
其中 type 為返回值類型,pointer 為函數(shù)指針變量名,parameter list 為參數(shù)類型列表
#include <stdio.h>typedef int (FUNC)(int); int test(int i) {return i * i; }void f() {printf("Call f()...\n"); }int main() {FUNC* pt = test; //合法,函數(shù)名就是函數(shù)體的入口地址//直接定義函數(shù)指針,&f是舊式寫法。函數(shù)名只是一個(gè)符號(hào)(不是變量),//與數(shù)組名一樣,并不為其分配內(nèi)存,因此&f和f在數(shù)值上是相等的。void(*pf)() = &f; //如果知道某個(gè)函數(shù)的地址,這里可以改為一個(gè)固定的地址值,實(shí)現(xiàn)跳轉(zhuǎn)! printf("pf = %p\n",pf);printf("f = %p\n",f);printf("&f = %p\n",&f); //結(jié)果應(yīng)為:pf == f == &f; pf();//利用函數(shù)指針調(diào)用 (*pf)(); //舊式寫法 printf("Function pointer call:%d\n",pt(2));return 0; }3. 回調(diào)函數(shù)
(1)回調(diào)函數(shù)是利用函數(shù)指針實(shí)現(xiàn)的一種調(diào)用機(jī)制
(2)回調(diào)機(jī)制原理
? ? ①調(diào)用者不知道具體事件發(fā)生時(shí)需要調(diào)用的具體函數(shù)
? ? ②被調(diào)函數(shù)不知道何時(shí)被調(diào)用,只知道需要完成的任務(wù)
? ? ③當(dāng)具體事件發(fā)生時(shí),調(diào)用者通過函數(shù)指針調(diào)用具體函數(shù)。
(3)回調(diào)機(jī)制中的調(diào)用者和被調(diào)用者互不依賴。
回調(diào)函數(shù)使用
#include <stdio.h>typedef int (*Weapon)(int); //操作某種武器的函數(shù)//使用某種武器與boss進(jìn)行戰(zhàn)斗 void fight(Weapon wp,int arg) //arg為傳給函數(shù)指針的參數(shù) {int result = 0;printf("Fight boss!\n");result = wp(arg);//調(diào)用回調(diào)函數(shù),并傳入?yún)?shù)arg printf("Boss loss:%d\n",result);//Boss失血多少? }//使用武器——刀 int knife(int n) {int ret = 0;int i = 0;for (i=0; i< n; i++){printf("Knife attack:%d\n",1);ret++;}printf("\n");return ret; }//使用武器——?jiǎng)?/span> int sword(int n) {int ret = 0;int i = 0;for (i=0; i< n; i++){printf("Sword attack:%d\n",5);ret++;}printf("\n");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++;}printf("\n");return ret; }int main() {fight(knife, 3);//用刀砍3次fight(sword, 4);//用劍刺4次fight(gun, 5); //開槍5次return 0; }函數(shù)指針是實(shí)現(xiàn)回調(diào)機(jī)制的關(guān)鍵技術(shù),通過函數(shù)指針可以在 C 程序中實(shí)現(xiàn)固定地址跳轉(zhuǎn)
?
參考資料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html
轉(zhuǎn)載于:https://www.cnblogs.com/CoderTian/p/5911451.html
總結(jié)
以上是生活随笔為你收集整理的C语言学习笔记--函数与指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端运行python代码几种方式_前端和
- 下一篇: [C语言 - 12] Union联合