函数指针和函数指针数组及其应用
先來看一個簡單的例子:
int a=3; void *p=&a;這是一個基礎的不能再基礎的例子。相信學過指針的都能看得懂。P是一個指針,指向a。a 是一個整形變量。函數指針和其類似,只不過其指向的不是一個變量,而是一個函數,僅此而已。話不多說,看個例子。
void (*funcPointer)(double x); void f1(double x){} void f2(double x){} funcPointer=f1; funcPointer=&f2;好了。簡單的5行代碼就完成了一個簡單的函數指針。我們一行行來看。第一行。聲明了一個函數指針。其和普通指針有啥區別。我放在一起讓大家看一下。
void (*funcPointer)(double x);//函數指針 void *pointer;//普通指針看出來了么。函數指針無非多了兩個括號和一個參數列表。想想也是。函數指針如果沒有參數列表那還玩個啥。所以肯定需要參數。那多那倆括號干嘛?好,那大家看一下這個例子。
void *funcPointer(double x);長得是不是和函數指針賊像。其實也就是像而已,他們是兩個東西。這個只是聲明了一個普通的函數(我把它起名叫funcPointer,只是想對比一下),它的返回值是一個void類型的指針而已。有些地方也把它叫做指針函數(就是返回值為指針的函數)好了聲明說完了,我們接下來往下看。第二三行沒啥說的,聲明倆函數而已。那么我么來看看四五行。函數指針既然是個指針,我們肯定要讓它指東西啊。那么這兩行就是讓它指向具體的函數。這兩種寫法都是OK的。都可以被編譯器接受。(以前只有第一種被認可,現在兩種都可以了)
好了,說了這么多。總結一下。函數指針就是指向函數體第一行可執行語句的一個指針。至于他有什么作用呢。這里給大家提供一個具體的應用的例子。相信,大家中學的時候都學過積分這個鬼東西。不知道還記不記得積分最原始的計算方法。對,沒錯,無限細分,求面積。好的。我們接下來就給大家一個應用函數指針有關積分計算的例子。直接貼出代碼。
#include <stdio.h> //Calculate用于計算積分。一共三個參數。第一個為函數指針func,指向待積分函數。二三參數為積分上下限 double Calculate(double(*func)(double x), double a, double b) { double dx = 0.0001;//細分的區間長度 double sum = 0; for (double xi = a+dx; xi <= b; xi+=dx) { double area = func(xi)*dx; sum +=area; } return sum; } double func_1(double x) { return x*x; } double func_2(double x) { return x*x*x; } void main() { printf("%lf\n", Calculate(func_1, 0, 1)); printf("%lf\n", Calculate(func_2, 0, 1)); } 2. 函數指針數組函數指針說完了。我們接下來來看看函數指針數組。多了倆字。數組。前面四個字還一樣。那是不是就是有一個數組,用它來盛放函數指針。嗯,沒錯,就是這樣。有了剛才的基礎,我直接給出例子。
void (*funcPointerArray[3])(double x);//函數指針數組 void (*funcPointer)(double x);//函數指針兩個放在一起對比,函數指針數組無非就像數組聲明一樣,在后面加了[]而已。僅此而已。那它怎么用呢?
void f2(double x){} void f3(double x){} //來三個具體的函數,f1,f2,f3. void (*funcPointerArray[3])(double x); funcPointerArray[0]=f1; funcPointerArray[1]=f2; funcPointerArray[2]=f3; funcPointerArray[0](“2.333333”); funcPointerArray[1](“6.666666”);簡直就和普通的數組一模一樣。沒錯,無非他存儲的是函數指針而已。
最后,貼一個用函數指針數組的具體的應用的例子。
#include <stdio.h> void addItem(char *name) { printf("Add %s successfully!\n",name); } void deleteItem(char *name) { printf("Delete %s successfully!\n", name); } void findItem(char *name) { printf("Find %s successfully!\n", name); } void updateItem(char *name) { printf("Update %s successfully!\n", name); } void main() { void(*funcPointerArray[4])(char *name); funcPointerArray[0] = addItem; funcPointerArray[1] = deleteItem; funcPointerArray[2] = findItem; funcPointerArray[3] = updateItem; printf("Please enter a number(0-3) to continue:"); int num; scanf_s("%d", &num,1); printf("Please enter the name of the goods:"); char buf[128]; scanf_s("%s", &buf,128); funcPointerArray[num](buf); } 在上述的例子中,用函數指針數組代替了大量的switch case 直接通過傳入的num值來調用不同的函數。好了,相信講到這里,大家應該清楚的明白什么是函數指針和函數指針數組了。總結
以上是生活随笔為你收集整理的函数指针和函数指针数组及其应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FATFS文件系统框架及源码分析
- 下一篇: QQ采用什么传输协议?