close

指標函數和函數指標有什麼區別

1.這兩個概念都是簡稱,指標函數是指帶指標的函數,即本質是一個函數。我們知道函數都又返回類型(如果不返回值,則為無值型),只不過指標函數返回類型是某一類型的指標。其定義格式如下所示:

返回類型識別字 *返回名稱(形式參數表)
{
函數體 }

返回類型可以是任何基本類型和複合類型。返回指標的函數的用途十分廣泛。事實上,每一個函數,即使它不帶有返回某種類型的指標,它本身都有一個進入點位址,該 位址相當於一個指標。比如函數返回一個整型值,實際上也相當於返回一個指標變數的值,不過這時的變數是函數本身而已,而整個函數相當於一個變數。例如 下面一個返回指標函數的例子:

#include<stdio.h>

float *find();
main()
{
     static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}};
     float *p;
     int i,m;
     printf("Enter the number to be found:");
     scanf("%d",&m);
     printf("the score of NO.%d are:n",m);
     p=find(score,m);
     for(i=0;i<4;i++)
         printf("%5.2ft",*(p+i));
}

float *find(float(*pionter)[4],int n)/*定義指標函數*/
{
     float *pt;
     pt=*(pionter+n);
     return(pt);
}

學生學號從0號算起,函數find()被定義為指標函數,起形參pointer是指標指向包含4個元素的一維陣列的指標變數。pointer+1指向 score的第一行。*(pointer+1)指向第一行的第0個元素。pt是一個指標變數,它指向浮點型變數。main()函數中呼叫find()函 數,將score陣列的首位址傳給pointer.

2,“函數指標是指向函數的指標變數,因而函數指標本身首先應是指標變數,只不 過該指標變數指向函數。這正如用指標變數可指向整型變數、字元型、陣列一樣,這裏是指向函數。如前所述,C在編譯時,每一個函數都有一個進入點位址,該進入點 位址就是函數指標所指向的位址。有了指向函數的指標變數後,可用該指標變數呼叫函數,就如同用指標變數可引用其他類型變數一樣,在這些概念上一致的。函數指標有兩個用途:呼叫函數和做函數的參數。函數指標的說明方法為:

資料類型標誌符 *指標變數名)(參數);注:函數括弧中的參數可有可無,視情況而定。

下面的程式說明了函數指標呼叫函數的方法:

#include<stdio.h> 

int max(int x,int y){ return(x>y?x:y); }

void main()
{
     int (*ptr)();
     int a,b,c;
     ptr=max;
     scanf("%d,%d",&a,&b);
     c=(*ptr)(a,b);
     printf("a=%d,b=%d,max=%d",a,b,c);
}

ptr 是指向函數的指標變數,所以可把函數max()賦給ptr作為ptr的值,即把max()的進入點位址賦予給ptr,以後就可以用ptr來呼叫該函數,實際上 ptrmax都指向同一個進入點位址,不同就是ptr是一個指標變數,不像函數名稱那樣是死的,它可以指向任何函數,就看你像怎麼做了。在程式中把哪個函數的位址賦給它,它就指向哪個函數。而後用指標變數呼叫它,因此可以先後指向不同的函數,不過注意,指向函數的指標變數沒有++--運算,用時要小心。

arrow
arrow
    全站熱搜

    Bluelove1968 發表在 痞客邦 留言(6) 人氣()