1. 首先,在C語(yǔ)言中函數(shù)是一種function-to-pointer的方式,即對(duì)于一個(gè)函數(shù),會(huì)將其自動(dòng)轉(zhuǎn)換成指針的類型.
void fun()
{
}
int main(void)
{
printf("%p %p %p/n", &fun, fun, *fun);
return 0;
}
===================================================
2. 如何調(diào)用一個(gè)地址上的函數(shù)
如果知道了一個(gè)函數(shù)所在的地址, 可以將其強(qiáng)制轉(zhuǎn)化成某一種類型的函數(shù)指針, 然后再根據(jù)這個(gè)指針去調(diào)用這個(gè)地址的函數(shù). 如:
void f(int i)
{
printf("i = %d/n", i);
}
int main(void)
{
unsigned long add;
add = (unsigned long)f;
((void (*)(int))add)(10);
(*(void (*)(int))add)(20);
return 0;
}
int min(int v1, int v2)
{
return (v1 < v2 ? v1 : v2);
}
int sum(int v1, int v2)
{
return (v1 + v2);
}
printf("p[0] = %d/n", (p[0])(3, 5));
printf("p[1] = %d/n", (p[1])(4, 6));
printf("p[2] = %d/n", (p[2])(1, 2));
return 0;
}
可以讓函數(shù)返回一個(gè)指向數(shù)組的一個(gè)指針, 如:
return 0;
}
/============================================/
/ 在看到快速排序的例子中使用到返回指針的函數(shù).所以特此查找到這篇文章,覺(jué)得很好... /
/============================================/
對(duì)這個(gè)問(wèn)題, signal()函數(shù)是最好的例子.
void (*signal (int signo, void (*func)(int)))(int);
很多朋友剛開(kāi)始看這個(gè)函數(shù)定義的時(shí)候是不太懂, 其實(shí)可以一步一步地慢慢看, 我以前是這樣分析的, 希望能對(duì)大家有用.
int (*p)();
這是一個(gè)函數(shù)指針, p所指向的函數(shù)是一個(gè)不帶任何參數(shù), 并且返回值為int的一個(gè)函數(shù).
int (*fun())();
這個(gè)式子與上面式子的區(qū)別在于用fun()代替了p,而fun()是一個(gè)函數(shù),所以說(shuō)就可以看成是fun()這個(gè)函數(shù)執(zhí)行之后,它的返回值是一個(gè)函數(shù)指針,這個(gè)函數(shù)指針(其實(shí)就是上面的p)所指向的函數(shù)是一個(gè)不帶任何參數(shù),并且返回值為int的一個(gè)函數(shù).
所以說(shuō)signal()可以看成是signal()函數(shù)(它自己是帶兩個(gè)參數(shù),一個(gè)為整型,一個(gè)為函數(shù)指針的函數(shù)), 而這個(gè)signal()函數(shù)的返回值也為一個(gè)函數(shù)指針,這個(gè)函數(shù)指針指向一個(gè)帶一個(gè)整型參數(shù),并且返回值為void的一個(gè)函數(shù).
=================================
signal函數(shù)返回的其實(shí)是指向以前的信號(hào)處理程序的指針, 所以舉一個(gè)例子來(lái)說(shuō)明返回指向函數(shù)的指針的用法.
void sig_fun2(int signo)
{
printf("in sig_fun2:%d/n", signo);
}
void sig_fun1(int signo)
{
printf("in sig_fun1:%d/n", signo);
}
int main(void)
{
unsigned long i;
if (signal(SIGUSR1, sig_fun1) == SIG_ERR) {
printf("signal fun1 error/n");
exit(1);
}
(signal(SIGUSR1, sig_fun2))(30);
printf("done/n");
return 0;
}
例如:
int max(int v1, int v2)
{
return (v1 > v2 ? v1 : v2);
}
int min(int v1, int v2)
{
return (v1 < v2 ? v1 : v2);
}
int sum(int v1, int v2)
{
return (v1 + v2);
}
int fun(int a, int b, int (*call)(int, int))
{
return (call(a, b));
}
int main(void)
{
printf("max=%d/n", fun(1, 2, max));
printf("min=%d/n", fun(3, 4, min));
printf("sum=%d/n", fun(5, 6, sum));
return 0;
}
新聞熱點(diǎn)
疑難解答
圖片精選