函式指標及結構體
阿新 • • 發佈:2019-01-26
函式及結構體
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);都可以。