函式指標和函式指標陣列及其應用
1. 函式指標
先來看一個簡單的例子。
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)); }
相信看了我剛才的介紹,這個例子很輕鬆就能看得懂。這個例子也清晰的把函式指標的作用表現的淋漓盡致。Calculate這個積分函式有一個引數是函式指標,那麼我麼在呼叫的時候只用傳入具體的函式名,他就能計算出這個函式的積分。是不是很方便。所以說函式指標是個很好用的東西。
2. 函式指標陣列
函式指標說完了。我們接下來來看看函式指標陣列。
多了倆字。陣列。前面四個字還一樣。那是不是就是有一個數組,用它來盛放函式指標。嗯,沒錯,就是這樣。
有了剛才的基礎,我直接給出例子。
void (*funcPointerArray[3])(double x);//函式指標陣列
void (*funcPointer)(double x);//函式指標
兩個放在一起對比,函式指標陣列無非就像陣列宣告一樣,在後面加了[]而已。僅此而已。
那它怎麼用呢?
void f1(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值來呼叫不同的函式。
好了,相信講到這裡,大家應該清楚的明白什麼是函式指標和函式指標陣列了。