1. 程式人生 > >函式指標及結構體

函式指標及結構體

函式及結構體

1.指標函式

     指標函式即帶指標的函式,其本質仍為一個函式,指標函式的返回型別是某一型別的指標。      如char *function1(char *s1, char *s2); 函式名為function1,返回值型別是一個指向char型別的指標。      如char **function2(char *s1, char *s2); 函式名為function2,返回值型別是char **,是個二級指標。
例:
#include <stdio.h>
char *function(char *s1);

int main(void)
{
    char str1[] = "hello!";
    char *str2 = NULL;
    str2 = function(str1);
    printf("%s\n",str2);
     //while(1);
    return 0;
}
char *function(char *s1)
{
    return s1;
}


2.函式指標

     函式指標是指向函式的指標變數。故函式指標本質上是一個指標變數,它指向一個函式。在C編譯時,每個函式都有一個入口地址,該入口地址就是函式指標指向的地址。有了指向函式的指標變數後,就可以用該指標變數呼叫函式。      如char * (*function)(char *s1, char *s2); function不是函式名,而是一個指標變數,它指向一個函式。這個函式有兩個指標型別的引數,返回值型別為char *。由於()的優先順序高於*,故一定要加小括號。第一個*表示這是一個返回值型別為指標的函式,第二個*表示function為函式指標。      注意:簡單宣告一個函式指標並不能立即使用,和其他指標一樣,在函式指標執行間接訪問之前需將其先初始化為指向某個函式。
例:
#include <stdio.h>
char *function(char *s1);
int main(void)
{
    char str1[] = "hello!";
    char *str2 = NULL;
    char * (*f)(char *s); //f : 函式指標
    f = &function;
    str2 = (*f)(str1);

    printf("%s\n",str2);
    //while(1);
    return 0;
}
char *function(char *s1)
{
    return s1;
}


注:f = &function;中,操作符&可以省略,因為函式名在被使用時總是由編譯器把它轉換為函式指標,&操作符只是顯示地說明了編譯器將隱式執行的任務。

4.函式指標作為結構體成員

     結構體成員可以是指標變數,而函式指標為指標變數。函式指標可以作為結構體成員。 例:
#include <stdio.h>
char *function(char *s1);
struct strf{
       char * (*f)(char *s); //f : 函式指標
};
int main(void)
{
       char str1[] = "hello!";
       char *str2 = NULL;
       struct strf strf1;
       strf1.f = &function;
       str2 = (*strf1.f)(str1);
       //str2 = strf1.f(str1);
       printf("%s\n",str2);
       //while(1);
       return 0;
}

char *function(char *s1)
{
	return s1;
}

注:結構體變數呼叫函式指標時和一般呼叫函式指標不一樣,上例中str2 = (*strf1.f)(str1);str2 = strf1.f(str1);都可以。

5.typedef與函式指標

     如:typedef int  (*fp)(int);可以理解為int (*)(int)為一個數據型別,那麼typedef int  (*fp)(int);則為這個資料型別重新取一個別名為fp,以後就可以像int,char一樣使用了。如 fp function;即定義了一個指標變數function。