日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

函数指针和函数指针数组及其应用

發(fā)布時間:2025/6/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 函数指针和函数指针数组及其应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 函數(shù)指針

先來看一個簡單的例子:

int a=3; void *p=&a;

這是一個基礎(chǔ)的不能再基礎(chǔ)的例子。相信學(xué)過指針的都能看得懂。P是一個指針,指向a。a 是一個整形變量。函數(shù)指針和其類似,只不過其指向的不是一個變量,而是一個函數(shù),僅此而已。話不多說,看個例子。

void (*funcPointer)(double x); void f1(double x){} void f2(double x){} funcPointer=f1; funcPointer=&f2;

好了。簡單的5行代碼就完成了一個簡單的函數(shù)指針。我們一行行來看。第一行。聲明了一個函數(shù)指針。其和普通指針有啥區(qū)別。我放在一起讓大家看一下。

void (*funcPointer)(double x);//函數(shù)指針 void *pointer;//普通指針

看出來了么。函數(shù)指針無非多了兩個括號和一個參數(shù)列表。想想也是。函數(shù)指針如果沒有參數(shù)列表那還玩?zhèn)€啥。所以肯定需要參數(shù)。那多那倆括號干嘛?好,那大家看一下這個例子。

void *funcPointer(double x);

長得是不是和函數(shù)指針賊像。其實也就是像而已,他們是兩個東西。這個只是聲明了一個普通的函數(shù)(我把它起名叫funcPointer,只是想對比一下),它的返回值是一個void類型的指針而已。有些地方也把它叫做指針函數(shù)(就是返回值為指針的函數(shù))好了聲明說完了,我們接下來往下看。第二三行沒啥說的,聲明倆函數(shù)而已。那么我么來看看四五行。函數(shù)指針既然是個指針,我們肯定要讓它指東西啊。那么這兩行就是讓它指向具體的函數(shù)。這兩種寫法都是OK的。都可以被編譯器接受。(以前只有第一種被認可,現(xiàn)在兩種都可以了)

好了,說了這么多。總結(jié)一下。函數(shù)指針就是指向函數(shù)體第一行可執(zhí)行語句的一個指針。至于他有什么作用呢。這里給大家提供一個具體的應(yīng)用的例子。相信,大家中學(xué)的時候都學(xué)過積分這個鬼東西。不知道還記不記得積分最原始的計算方法。對,沒錯,無限細分,求面積。好的。我們接下來就給大家一個應(yīng)用函數(shù)指針有關(guān)積分計算的例子。直接貼出代碼。

#include <stdio.h> //Calculate用于計算積分。一共三個參數(shù)。第一個為函數(shù)指針func,指向待積分函數(shù)。二三參數(shù)為積分上下限 double Calculate(double(*func)(double x), double a, double b) { double dx = 0.0001;//細分的區(qū)間長度 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ù)指針說完了。我們接下來來看看函數(shù)指針數(shù)組。多了倆字。數(shù)組。前面四個字還一樣。那是不是就是有一個數(shù)組,用它來盛放函數(shù)指針。嗯,沒錯,就是這樣。有了剛才的基礎(chǔ),我直接給出例子。

void (*funcPointerArray[3])(double x);//函數(shù)指針數(shù)組 void (*funcPointer)(double x);//函數(shù)指針兩個放在一起對比,函數(shù)指針數(shù)組無非就像數(shù)組聲明一樣,在后面加了[]而已。僅此而已。那它怎么用呢?
void f2(double x){} void f3(double x){} //來三個具體的函數(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”);簡直就和普通的數(shù)組一模一樣。沒錯,無非他存儲的是函數(shù)指針而已。

最后,貼一個用函數(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 直接通過傳入的num值來調(diào)用不同的函數(shù)。好了,相信講到這里,大家應(yīng)該清楚的明白什么是函數(shù)指針和函數(shù)指針數(shù)組了。



總結(jié)

以上是生活随笔為你收集整理的函数指针和函数指针数组及其应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。