1. 程式人生 > >函式指標與指標函式以及結構體呼叫函式的方法

函式指標與指標函式以及結構體呼叫函式的方法

        以前忘記在哪見過見過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);