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