|
Posted on 2006-07-23 13:52 人生亦編程 閱讀(187) 評論(0) 編輯 收藏 引用 所屬分類: 程序
#include?


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);?
}
?
指針函數(shù)和函數(shù)指針有什么區(qū)別
1,這兩個概念都是簡稱,指針函數(shù)是指帶指針的函數(shù),即本質(zhì)是一個函數(shù)。我們知道函數(shù)都又返回類型(如果不返回值,則為無值型),只不過指針函數(shù)返回類型是某一類型的指針。其定義格式如下所示:
返回類型標(biāo)識符 *返回名稱(形式參數(shù)表) { 函數(shù)體 }
返回類型可以是任何基本類型和復(fù)合類型。返回指針的函數(shù)的用途十分廣泛。事實上,每一個函數(shù),即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當(dāng)于一個指針。比如函數(shù)返回一個整型值,實際上也相當(dāng)于返回一個指針變量的值,不過這時的變量是函數(shù)本身而已,而整個函數(shù)相當(dāng)于一個“變量”。例如下面一個返回指針函數(shù)的例子:

#include?

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.2f\t",*(p+i));?
}?

 float?*find(float(*pionter)[4],int?n)/**//*定義指針函數(shù)*/?
  {?
????float?*pt;?
????pt=*(pionter+n);?
????return(pt);?
}?
 學(xué)生學(xué)號從0號算起,函數(shù)find()被定義為指針函數(shù),起形參pointer是指針指向包含4個元素的一維數(shù)組的指針變量。pointer+1指向score的第一行。*(pointer+1)指向第一行的第0個元素。pt是一個指針變量,它指向浮點型變量。main()函數(shù)中調(diào)用find()函數(shù),將score數(shù)組的首地址傳給pointer.
2,“函數(shù)指針”是指向函數(shù)的指針變量,因而“函數(shù)指針”本身首先應(yīng)是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。如前所述,C在編譯時,每一個函數(shù)都有一個入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂贰S辛酥赶蚝瘮?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上一致的。函數(shù)指針有兩個用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。函數(shù)指針不能絕對不能指向不同類型,或者是帶不同形參的函數(shù),在定義函數(shù)指針的時候我們很容易犯如下的錯誤。
int *fp(int a);//這里是錯誤的,因為按照結(jié)合性和優(yōu)先級來看就是先和()結(jié)合,然后變成了一個返回整形指針的函數(shù)了,而不是函數(shù)指針,這一點尤其需要注意!
函數(shù)指針的說明方法為: 數(shù)據(jù)類型標(biāo)志符 (*指針變量名)(參數(shù));注:函數(shù)括號中的參數(shù)可有可無,視情況而定。 下面的程序說明了函數(shù)指針調(diào)用函數(shù)的方法:
ptr是指向函數(shù)的指針變量,所以可把函數(shù)max()賦給ptr作為ptr的值,即把max()的入口地址賦給ptr,以后就可以用ptr來調(diào)用該函數(shù),實際上ptr和max都指向同一個入口地址,不同就是ptr是一個指針變量,不像函數(shù)名稱那樣是死的,它可以指向任何函數(shù),就看你像怎么做了。在程序中把哪個函數(shù)的地址賦給它,它就指向哪個函數(shù)。而后用指針變量調(diào)用它,因此可以先后指向不同的函數(shù),不過注意,指向函數(shù)的指針變量沒有++和--運算,用時要小心。
|