1. 程式人生 > >函式指標和函式指標陣列及其應用

函式指標和函式指標陣列及其應用

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值來呼叫不同的函式。


好了,相信講到這裡,大家應該清楚的明白什麼是函式指標和函式指標陣列了。