天天看點

函數指針和指針函數

 轉載自 http://lionwq.spaces.eepw.com.cn/articles/article/item/18258

【函數指針】

       在程式運作中,函數代碼是程式的算法指令部分,它們和數組一樣也占用存儲空間,都有相應的位址。可以使用指針變量指向數組的首位址,也可以使用指針變量指向函數代碼的首位址,指向函數代碼首位址的指針變量稱為函數指針。

1.函數指針定義

函數類型 (*指針變量名)(形參清單);

“函數類型”說明函數的傳回類型,由于“()”的優先級高于“*”,是以指針變量名外的括号必不可少,後面的“形參清單”表示指針變量指向的函數所帶的參數清單。

例如:

int (*f)(int x);

double (*ptr)(double x);

在定義函數指針時請注意:

函數指針和它指向的函數的參數個數和類型都應該是—緻的;

函數指針的類型和函數的傳回值類型也必須是一緻的。

2.函數指針的指派

函數名和數組名一樣代表了函數代碼的首位址,是以在指派時,直接将函數指針指向函數名就行了。

例如,

int func(int x);   /* 聲明一個函數 */

int (*f) (int x);    /* 聲明一個函數指針 */

f=func;            /* 将func函數的首位址賦給指針f */

指派時函數func不帶括号,也不帶參數,由于func代表函數的首位址,是以經過指派以後,指針f就指向函數func(x)的代碼的首位址。

3.通過函數指針調用函數

函數指針是通過函數名及有關參數進行調用的。

與其他指針變量相類似,如果指針變量pi是指向某整型變量i的指針,則*p等于它所指的變量i;如果pf是指向某浮點型變量f的指針,則*pf就等價于它所指的變量f。同樣地,*f是指向函數func(x)的指針,則*f就代表它所指向的函數func。是以在執行了f=func;之後,(*f)和func代表同一函數。

由于函數指針指向存儲區中的某個函數,是以可以通過函數指針調用相應的函數。現在我們就讨論如何用函數指針調用函數,它應執行下面三步:

首先,要說明函數指針變量。

例如:int (*f)(int x);

其次,要對函數指針變量指派。

例如: f=func;    (func(x)必須先要有定義)

最後,要用 (*指針變量)(參數表);調用函數。

例如:    (*f)(x);(x必須先指派)

【例】任意輸入n個數,找出其中最大數,并且輸出最大數值。

main()

{

        int f();

        int i,a,b;

        int (*p)();    /* 定義函數指針 */

        scanf("%d",&a);

        p=f;            /* 給函數指針p指派,使它指向函數f */

        for(i=1;i<9;i++)

        {

                scanf("%d",&b);

                a=(*p)(a,b);    /* 通過指針p調用函數f */

        }

        printf("the max number is:%d",a)

}

f(int x,int y)

    int z;

    z=(x>y)?x:y;

    return(z);

運作結果為:

343 -45 4389 4235 1 -534 988 555 789↙

the max number is:4389

【指針函數】

一個函數不僅可以帶回一個整型資料的值,字元類型值和實型類型的值,還可以帶回指針類型的資料,使其指向某個位址單元。

        傳回指針的函數,一般定義格式為:

        類型辨別符    *函數名(參數表)

int *f(x,y);

其中x,y是形式參數,f是函數名,調用後傳回一個指向整型資料的位址指針。f(x,y)是函數,其值是指針。

如:char *ch();表示的就是一個傳回字元型指針的函數,請看下面的例題:

【例】将字元串1(str1)複制到字元串2(str2),并輸出字元串2.

#include "stdio.h"

    char *ch(char *,char *);

    char str1[]="i am glad to meet you!";

    char str2[]="welcom to study c!";

    printf("%s",ch(str1,str2));

char *ch(char *str1,char *str2)

    int i;

    char *p;

    p=str2

    if(*str2==null) exit(-1);

    do

    {

        *str2=*str1;

        str1++;

        str2++;

    }while(*str1!=null);

    return(p);

通過分析可得

函數指針是一個指向函數的指針,而指針函數隻是說明他是一個傳回值為指針的函數,

函數指針可以用來指向一個函數。

繼續閱讀