先分別定義三個函數:加、減、乘
void add(int * a, int b)
{
*a += b;
}
void subtract(int* a, int b)
{
*a -= b;
}
void multiply(int * a, int b) {
*a *= b;
}
而函數名本身就是函數的地址(類似陣列)
所以你可以直接使用函數名來取得它的地址
而根據剛剛上面這些函數
返回形式為void
,參數型態為(int * int )
這個函數指標的形式需要被宣告為void (*指針名稱)(int * , int)
:
void (*func_ptr1)(int*, int) = add; // 直接使用函數名
void (*func_ptr2)(int*, int) = &add; // 使用取址符號 &
操作也是類似其他指向變數的指針
而接下來也可以利用指針來操作函數:
func_ptr1(&a, b); // 使用 func_ptr1 調用 add 函數
func_ptr2(&a, b); // 使用 func_ptr2 調用 add 函數
既然可以被視為地址
函數本身也可以做為其他函數的參數
下面先分別宣告add
、subtract
以及multiply
以及一個comput
函數
void add(int * a, int b)
{
*a += b;
}
void subtract(int* a, int b)
{
*a -= b;
}
void multiply(int * a, int b) {
*a *= b;
}
void comput(int* x, int y, void (*op)(int*, int))
{
op(x, y);
}
其中comput
第三個參數的輸入形式為 void (* op)(int *, int)
也就是一個函數指針,指向返回void
,輸入為(int*, int)
的函數
而add
、subtract
以及multiply
皆符合
因此調用時可以如此使用:
int main()
{
int a = 10;
int b= 5;
comput(&a, b, multiply );
/*調用comput時直接輸入函數名稱multiply , 函數名稱本身就是地址 */
printf("a * b = %d\\n", a);
exit(0);
}
/*輸出:
a * b = 50
*/
當然我們也可以宣告一個指標陣列operations
陣列上的每個元素皆指向剛剛宣告的add
、subtract
以及multiply
函數
當然返回形式與參數形式都要是固定的
void (*指標陣列名稱[元素個素])(int * , int)
:
void (*operations[3])(int*, int) = { add, subtract, multiply };
調用時也可使用陣列的用法
int main()
{
void (*operations[3])(int*, int) = { add, subtract, multiply };
int a = 17;
int b= 4;
operations[0](&a, b); /*如使用陣列的方式訪問元素並執行add*/
printf("a + b = %d\\n", a);
exit(0);
}
/*
輸出
a + b = 21
*/
而函數指標陣列本身亦可作為函數的參數
在宣告一個comput2
:
void comput2(int* x, int y, void(*op[3])(int *, int) , int n)
{
op[n](x, y);
}
如同二維陣列作為參數一般
也需要將元素個數先定義
使用時comput2
也十分直觀:
int main()
{
void (*operations[3])(int*, int) = { add, subtract, multiply };
int a = 17;
int b = 4;
comput2(&a, b, operations, 1); /*執行operations[1] ,即subtract*/
printf("a - b = %d\\n", a);
exit(0);
}
/*
輸出
a - b = 13
*/