函式指標與指標函式以及結構體呼叫函式的方法
以前忘記在哪見過見過C語言中:結構體通過指標的方式呼叫函式的方法,就一直找,找了半天,同時發現自己對函式指標和指標函式這兩個概念沒搞清楚。下面先說一下兩者的區別。再者就是說一下結構體是如何通過函式指標的方式呼叫函式的。
1、指標函式
指標函式本質是一個函式,函式返回型別是某一型別的指標。
定義格式 :函式型別 * 函式名( 引數列表)
例: int * func1 (x, y ) 返回值為 整型型別指標的函式
char * func2 (x, y ) 返回值為 字元型別指標的函式
這裡 func1(x, y ) 和func2(x,y)都是函式。呼叫時直接寫func1(),不用加 *,而且不能把一個指標賦給此函式func1或func2;
例:
#include "stdio.h"
char *func(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);
}
main()
{ char str1[]="hello world!";
char str2[]="Welcom to study C!";
printf("%s",func(str1,str2)); //func(str1,str2))是指標
}
2、函式指標
函式型別 (*指標變數名)(形參列表);第一個括號一定不能少。
“函式型別”說明函式的返回型別,由於“()”的優先順序高於“*”,所以指標變數名外的括號必不可少。
注意指標函式與函式指標表示方法的不同,千萬不要混淆。最簡單的辨別方式就是看函式名前面的指標*號有沒有被括號()包含,如果被包含就是函式指標,反之則是指標函式。
例 int F();//宣告一個函式;
int (*P)() ;// 宣告函式指標
main()
{ P=F;
(*P)();//呼叫函式
}
3、易混淆之處
int *( *func) ( x,y); //第一個星花*表示此函式是個返回值為整型指標的函式,第二個星花*表示func為函式指標。
函式呼叫的方法: (*func)(x,y);
4、結構體呼叫函式的方法
呼叫方法 :結構體增加函式指標為成員變數
例:
typedef struct student
{
int xPosition;
int yPosition;
void ( *fun ) (x ,y );
} stu; //定義一個結構體
MyFunc(); //宣告並定義一個函式
... ...
stu Xiaoming[1]={ 0,0, MyFunc }; //實現一個結構體
func=MyFunc; // 給結構體的函式指標賦值
Xiaoming.func(x, y); //呼叫結構體中的函式
注意結構體呼叫函式時,和一般呼叫函式指標時不一樣,這裡不需要加那個星花 *
一般呼叫帶函式指標的函式的方法是:(* func)(x, y);