函式指標
指標也可用於指向功能。
我們來看一個基本功能:
int my_function(int a, int b)
{
return 2 * a + 3 * b;
}
現在,讓我們定義該函式型別的指標:
int (*my_pointer)(int, int);
要建立一個,只需使用此模板:
return_type_of_func (*my_func_pointer)(type_arg1, type_arg2, ...)
然後我們必須將此指標指定給函式:
my_pointer = &my_function;
此指標現在可用於呼叫該函式:
/* Calling the pointed function */
int result = (*my_pointer)(4, 2);
...
/* Using the function pointer as an argument to another function */
void another_function(int (*another_pointer)(int, int))
{
int a = 4;
int b = 2;
int result = (*another_pointer)(a, b);
printf("%d
", result);
}
儘管這種語法看起來更自然且與基本型別一致,但是歸因和解除引用函式指標不需要使用 &
和*
運算子。因此,以下程式碼段同樣有效:
/* Attribution without the & operator */
my_pointer = my_function;
/* Dereferencing without the * operator */
int result = my_pointer(4, 2);
為了提高函式指標的可讀性,可以使用 typedef。
typedef void (*Callback)(int a);
void some_function(Callback callback)
{
int a = 4;
callback(a);
}
另一個可讀性技巧是 C 標準允許人們將上述引數中的函式指標(但不是在變數宣告中)簡化為看起來像函式原型的東西; 因此,以下內容可以等效地用於函式定義和宣告:
void some_function(void `callback(int)`)
{
int a = 4;
callback(a);
}