函数指针和函数指针数组及其应用
先來(lái)看一個(gè)簡(jiǎn)單的例子:
int a=3; void *p=&a;這是一個(gè)基礎(chǔ)的不能再基礎(chǔ)的例子。相信學(xué)過(guò)指針的都能看得懂。P是一個(gè)指針,指向a。a 是一個(gè)整形變量。函數(shù)指針和其類(lèi)似,只不過(guò)其指向的不是一個(gè)變量,而是一個(gè)函數(shù),僅此而已。話不多說(shuō),看個(gè)例子。
void (*funcPointer)(double x); void f1(double x){} void f2(double x){} funcPointer=f1; funcPointer=&f2;好了。簡(jiǎn)單的5行代碼就完成了一個(gè)簡(jiǎn)單的函數(shù)指針。我們一行行來(lái)看。第一行。聲明了一個(gè)函數(shù)指針。其和普通指針有啥區(qū)別。我放在一起讓大家看一下。
void (*funcPointer)(double x);//函數(shù)指針 void *pointer;//普通指針看出來(lái)了么。函數(shù)指針無(wú)非多了兩個(gè)括號(hào)和一個(gè)參數(shù)列表。想想也是。函數(shù)指針如果沒(méi)有參數(shù)列表那還玩?zhèn)€啥。所以肯定需要參數(shù)。那多那倆括號(hào)干嘛?好,那大家看一下這個(gè)例子。
void *funcPointer(double x);長(zhǎng)得是不是和函數(shù)指針賊像。其實(shí)也就是像而已,他們是兩個(gè)東西。這個(gè)只是聲明了一個(gè)普通的函數(shù)(我把它起名叫funcPointer,只是想對(duì)比一下),它的返回值是一個(gè)void類(lèi)型的指針而已。有些地方也把它叫做指針函數(shù)(就是返回值為指針的函數(shù))好了聲明說(shuō)完了,我們接下來(lái)往下看。第二三行沒(méi)啥說(shuō)的,聲明倆函數(shù)而已。那么我么來(lái)看看四五行。函數(shù)指針既然是個(gè)指針,我們肯定要讓它指東西啊。那么這兩行就是讓它指向具體的函數(shù)。這兩種寫(xiě)法都是OK的。都可以被編譯器接受。(以前只有第一種被認(rèn)可,現(xiàn)在兩種都可以了)
好了,說(shuō)了這么多。總結(jié)一下。函數(shù)指針就是指向函數(shù)體第一行可執(zhí)行語(yǔ)句的一個(gè)指針。至于他有什么作用呢。這里給大家提供一個(gè)具體的應(yīng)用的例子。相信,大家中學(xué)的時(shí)候都學(xué)過(guò)積分這個(gè)鬼東西。不知道還記不記得積分最原始的計(jì)算方法。對(duì),沒(méi)錯(cuò),無(wú)限細(xì)分,求面積。好的。我們接下來(lái)就給大家一個(gè)應(yīng)用函數(shù)指針有關(guān)積分計(jì)算的例子。直接貼出代碼。
#include <stdio.h> //Calculate用于計(jì)算積分。一共三個(gè)參數(shù)。第一個(gè)為函數(shù)指針func,指向待積分函數(shù)。二三參數(shù)為積分上下限 double Calculate(double(*func)(double x), double a, double b) { double dx = 0.0001;//細(xì)分的區(qū)間長(zhǎng)度 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. 函數(shù)指針數(shù)組函數(shù)指針說(shuō)完了。我們接下來(lái)來(lái)看看函數(shù)指針數(shù)組。多了倆字。數(shù)組。前面四個(gè)字還一樣。那是不是就是有一個(gè)數(shù)組,用它來(lái)盛放函數(shù)指針。嗯,沒(méi)錯(cuò),就是這樣。有了剛才的基礎(chǔ),我直接給出例子。
void (*funcPointerArray[3])(double x);//函數(shù)指針數(shù)組 void (*funcPointer)(double x);//函數(shù)指針兩個(gè)放在一起對(duì)比,函數(shù)指針數(shù)組無(wú)非就像數(shù)組聲明一樣,在后面加了[]而已。僅此而已。那它怎么用呢?
void f2(double x){} void f3(double x){} //來(lái)三個(gè)具體的函數(shù),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”);簡(jiǎn)直就和普通的數(shù)組一模一樣。沒(méi)錯(cuò),無(wú)非他存儲(chǔ)的是函數(shù)指針而已。
最后,貼一個(gè)用函數(shù)指針數(shù)組的具體的應(yīng)用的例子。
#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); } 在上述的例子中,用函數(shù)指針數(shù)組代替了大量的switch case 直接通過(guò)傳入的num值來(lái)調(diào)用不同的函數(shù)。好了,相信講到這里,大家應(yīng)該清楚的明白什么是函數(shù)指針和函數(shù)指針數(shù)組了。總結(jié)
以上是生活随笔為你收集整理的函数指针和函数指针数组及其应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: FATFS文件系统框架及源码分析
- 下一篇: QQ采用什么传输协议?