[C語言] function pointer介紹

MuLong PuYang
4 min readJan 6, 2019

--

其實我覺得,pointer是C語言中的精隨,而function pointer更是C語言中的利器,只是我覺得不管是我在C語言的學習過程,還是說在編程的過程中,function pointer的重要性常常不受關注,很少被提起,再加上pointer本身就不好理解,function pointer就更不好理解,所以關注的少,但我想function pointer本身的好用,是值得好好地介紹。

首先我們來創造一個普通的function

這裡我們先宣告一個普通的函數 func,接收一個參數 a,並回傳這個參數的值

#include <stdio.h>int func(int a) { // create a function named as "func"
return a;
};
int main(int argc, char* argv[])
{
return 0;
}

接著我們需要創立一個pointer來指向這個function,如此這個pointer才是真正的function pointer

現在讓我們創造function pointer

在我們的主程式main中,我們宣告了一個function pointer,int (*func_ptr)(int),來指向func這個函數

#include <stdio.h>int func(int a) {
return a;
};
int main(int argc, char* argv[])
{
int (*func_ptr)(int) = func; // make function pointer to point func
return 0;
}

使用function pointer

現在我們使用著這個指向func函數的function pointer,func_ptr(10)就可以得到結果

#include <stdio.h>int func(int a) {
return a;
};
int main(int argc, char* argv[])
{
int (*func_ptr)(int) = func;
printf("%d\n", func_ptr(10)); // use function pointer
return 0;
}

Function pointer對比一般的function

其實我想之所以function pointer比較難以被接受的其中一個原因,是因為其語法格式與一般熟知的C語言是有段差距的,所以以下我們就一般的函數宣告以及function pointer的宣告這個語法格式的比較。

宣告型態

在宣告型態這邊,我們可以看到如果一開始宣告的function為int的型態,則同樣在function pointer的宣告,同樣也是使用int。

函數名稱

這裡我們可以看到函數名稱為func,則在宣告function pointer的時候,pointer的形式為擁有括號的(*func_ptr)。

參數型態

在參數型態可以看到原本的函數是接收的一個int型態的變數a,所以我們在function pointer的參數型態時,是使用擁有括號的(int)這樣來代表參數的型態。

小結

由 int func(int a)對應到的function pointer型態 int (*func_ptr)(int),function pointer一開始比較難以接受的原因或許是整個語法型態跟一般的C語言相比會比較奇怪,尤其是(*func_ptr)與(int)的兩個括號,但是會使用function pointer的話,那將是使用C語言的一大利器。

--

--