日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

關(guān)于指針與函數(shù)的幾點(diǎn)小結(jié)...

 jijo 2008-12-04
關(guān)于指針與函數(shù)的幾點(diǎn)小結(jié)
這個(gè)文章講的還不錯(cuò).今天晚上好好實(shí)踐一下.謝謝這個(gè)大狹的文章.
心血來(lái)潮, 想對(duì)函數(shù)指針的幾個(gè)用法小結(jié)一下, 都是平常容易見(jiàn)到的, 如果還有其它不覺(jué)的用法也請(qǐng)朋友們不吝賜教.

若有錯(cuò)誤之處,還請(qǐng)指正.

1. 首先,在C語(yǔ)言中函數(shù)是一種function-to-pointer的方式,即對(duì)于一個(gè)函數(shù),會(huì)將其自動(dòng)轉(zhuǎn)換成指針的類(lèi)型.如:
[CODE]
#include<stdio.h>

void fun()
{
}

int main()
{
        printf("%p      %p      %p\n", &fun, fun, *fun);
        return 0;
}
[/CODE]
這三個(gè)值的結(jié)果是一樣的. 其實(shí)對(duì)于最后的那個(gè)*fun, 即使前面加上很多個(gè)*號(hào), 其結(jié)果也不變, 即**fun, ***fun的結(jié)果都是一樣的. 對(duì)于這個(gè)問(wèn)題, 因?yàn)橹爸v過(guò)函數(shù)是一種
function-to-pointer方式, 其會(huì)自動(dòng)轉(zhuǎn)換成指針的類(lèi)型, &fun是該函數(shù)的地址, 為指針類(lèi)型, fun是一個(gè)函數(shù), 會(huì)轉(zhuǎn)換成其指針類(lèi)型, 而對(duì)于*fun, 由于fun已經(jīng)變成了指針類(lèi)型, 指向這個(gè)函數(shù), 所以*fun就是取這個(gè)地址的函數(shù), 而又根據(jù)function-to-pointer, 該函數(shù)也轉(zhuǎn)變成了一個(gè)指針, 所以以此類(lèi)推, 這三個(gè)值的結(jié)果是相同的.

2. 如何調(diào)用一個(gè)地址上的函數(shù)
  如果知道了一個(gè)函數(shù)所在的地址, 可以將其強(qiáng)制轉(zhuǎn)化成某一種類(lèi)型的函數(shù)指針, 然后再根據(jù)這個(gè)指針去調(diào)用這個(gè)地址的函數(shù). 如:
[CODE]
#include<stdio.h>

void f(int i)
{
        printf("i = %d\n", i);
}

int main()
{
        unsigned long add;
        add = (unsigned long)f;
        ((void (*)(int))add)(10);
        (*(void (*)(int))add)(20);
        return 0;
}
[/CODE]
使用(void (*)(int))的方式可以將一個(gè)地址轉(zhuǎn)換成一個(gè)帶int參數(shù)且沒(méi)有返回值的函數(shù)的指針類(lèi)型, 然后再去調(diào)用, 由于第1點(diǎn)中講的function-to-pointer, 所以最后兩條語(yǔ)句中加與不加那個(gè)*號(hào)效果都是一樣的. 在嵌入式方面經(jīng)常用到這種方式.

3. 函數(shù)指針數(shù)組的用法.
有時(shí)候需要定義一個(gè)數(shù)組, 其內(nèi)容為一系列的函數(shù)指針, 然后對(duì)其進(jìn)行調(diào)用, 如:
[CODE]
#include<stdio.h>
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 main()
{
        int (*p[3])(int, int);
        p[0] = max;
        p[1] = min;
        p[2] = sum;

        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;
}
[/CODE]
雖然感覺(jué)這種方法有點(diǎn)累贅, 但是也算是一種使用的方式, 所以介紹一下.

4.返回一個(gè)指向數(shù)組的指針的方式
可以讓函數(shù)返回一個(gè)指向數(shù)組的一個(gè)指針, 如:
[CODE]
#include<stdio.h>
#include<stdlib.h>
int (*p())[10]
{
int (*m)[10];
int i;
m = (int (*)[10])malloc(10 * sizeof(int));
if (m == NULL)
{
printf("malloc error\n");
exit(1);
}
for (i = 0; i < 10; i++)
*(*m+i) = i+1;
return m;
}

int main()
{
int (*a)[10];
int i;
a = p();
for (i = 0; i < 10; i++)
printf("%d ", *(*a+i));
printf("\ndone\n");
return 0;
}
[/CODE]
這種方式中,int (*a)[10]是一個(gè)指向一維數(shù)組的一個(gè)指針, 而p()也是返回一個(gè)指向一維數(shù)組的一個(gè)指針.

5.返回一個(gè)函數(shù)指針的指針
對(duì)這個(gè)問(wèn)題, signal()函數(shù)是最好的例子, 
[CODE]
void (*signal (int signo, void (*func)(int)))(int);
[/CODE]
很多朋友剛開(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ō)對(duì)于
[CODE]
void (*signal(int signo, void (*fun)(int)))(int);
[/CODE]
就可以看成是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ù)的指針的用法,如:
[CODE]
#include<signal.h>
#include<stdlib.h>
#include<stdio.h>

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()
{
        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;
}
[/CODE]

6. 使用函數(shù)指針作為參數(shù)的情況
在函數(shù)的參數(shù)中, 可能會(huì)帶有一個(gè)函數(shù)指針, 這在signal()函數(shù)中是出現(xiàn)了的, 另外再寫(xiě)個(gè)例子如:

[CODE]
#include<stdio.h>

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()
{
        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;
}
[/CODE]
其實(shí)在很多排序函數(shù)中就是使用的這個(gè)參數(shù)為函數(shù)指針的方式來(lái)進(jìn)行調(diào)用的.

草草地總結(jié)了一下, 希望能有一些用.  :-)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多