函式指標(指向函式的指標)和指標函式的區別
函式指標和指標函式的區別:
一、【函式指標】
在程式執行中,函式程式碼是程式的演算法指令部分,它們和陣列一樣也佔用儲存空間,都有相應的地址。可以使用指標變數指向陣列的首地址,也可以使用指標變數指向函式程式碼的首地址,指向函式程式碼首地址的指標變數稱為函式指標。
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"
main()
{
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);
}
通過分析可得:
函式指標是一個指向函式的指標,而指標函式只是說明他是一個返回值為指標的函式, 函式指標可以用來指向一個函式。