C function pointer 指標函數
相當方便的指標函數,可以輕鬆的乎叫對應的function。
(C function pointer with array can make functions call easier.)
所有的function都有一個位址,例如 func1() ,呼叫時我們可以直接呼叫func1();
或是透過指標,如: int(*p)(); 先宣告一個指標,然後 p=func1; or p=&func1; 都可以,func1 與 &func1,都是func1的起始位置。
a.呼叫時 1. p(); 2. (*p)(); 都可以,此時p與*p都是func1的起始位置。
b.(*p)()不可以寫成*p(),()優先序高於*,這樣會出錯。
c. 對指標含數進行*(p+1) 之類的運算是沒意義的。
所有的function都有一個位址,例如 func1() ,呼叫時我們可以直接呼叫func1();
或是透過指標,如: int(*p)(); 先宣告一個指標,然後 p=func1; or p=&func1; 都可以,func1 與 &func1,都是func1的起始位置。
a.呼叫時 1. p(); 2. (*p)(); 都可以,此時p與*p都是func1的起始位置。
b.(*p)()不可以寫成*p(),()優先序高於*,這樣會出錯。
c. 對指標含數進行*(p+1) 之類的運算是沒意義的。
#include <stdio .h>
#include<stdlib .h>
typedef int (*MYFUNC)();
int func1()
{
printf("\n%s\n",__func__);
}
int func2()
{
printf("\n%s\n",__func__);
}
int func3()
{
printf("\n%s\n",__func__);
}
/* static (*funcs[3])() = { &func1, &func2, &func3};
* static (*funcs[3])() = { func1, func2, func3};
* 這三個寫法都一樣的效果,&可加可不加,都是指到同樣的位址。
*/
static MYFUNC funcs[3] = { &func1, &func2, &func3};
int main(int argc, char *argv[])
{
(*(funcs[atoi(argv[1])]))();
}
執行結果(result):
[root@new-host-832 stanley]# ./a.out 0 func1 [root@new-host-832 stanley]# ./a.out 1 func2 [root@new-host-832 stanley]# ./a.out 2 func3上面的範例,要剛好argv是照0~2,若argv是分開的話,可以用下面的做法。
#include <stdio .h>
#include<stdlib .h>
#define ARRAY_LEN(x) (sizeof(x)/sizeof((x)[0])) //sizeof(x)是array x的總長, sizeof(x[0])是求x[0]用掉的空間..相除便是用array的size
#define FUNC_NUM ARRAY_LEN(CmdTable)
typedef void (*MYFUNC)();
typedef struct{
char *CmdName;
MYFUNC Cmdfunc;
}CMD;
void func1()
{
printf("\n%s\n",__func__);
}
void func2()
{
printf("\n%s\n",__func__);
}
void func3()
{
printf("\n%s\n",__func__);
}
CMD CmdTable[]={
{"39",func1},
{"66",func2},
{"99",func3}
};
int main(int argc, char *argv[])
{
int i=0;
for(i=0; i< FUNC_NUM ;i++){
if( !strcmp(argv[1],CmdTable[i].CmdName) )
(*(CmdTable[i].Cmdfunc))();
}
}
執行結果如下: iwpriv, iwlist 很多open source的程式會用到這個方法。
[root@new-host-832 stanley]# ./a.out 39 func1 [root@new-host-832 stanley]# ./a.out 66 func2 [root@new-host-832 stanley]# ./a.out 99 func3
留言