関数ポインタおよび構造体

2766 ワード

関数および構造体
1.ポインタ関数
ポインタ関数はポインタ付き関数であり、その本質は依然として関数であり、ポインタ関数の戻りタイプはあるタイプのポインタである.
例えばchar*function 1(char*s 1,char*s 2);関数名はfunction 1で、戻り値タイプはcharタイプを指すポインタです.
例えばchar**function 2(char*s 1,char*s 2);関数名はfunction 2で、戻り値タイプはchar**で、2次ポインタです.
例:
#include 
char *function(char *s1);

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

2.函数指针

     函数指针是指向函数的指针变量。故函数指针本质上是一个指针变量,它指向一个函数。在C编译时,每个函数都有一个入口地址,该入口地址就是函数指针指向的地址。有了指向函数的指针变量后,就可以用该指针变量调用函数。
     如char * (*function)(char *s1, char *s2); function不是函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,返回值类型为char *。由于()的优先级高于*,故一定要加小括号。第一个*表示这是一个返回值类型为指针的函数,第二个*表示function为函数指针。
     注意:简单声明一个函数指针并不能立即使用,和其他指针一样,在函数指针执行间接访问之前需将其先初始化为指向某个函数。
例:
#include 
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
",str2); //while(1); return 0; } char *function(char *s1) { return s1; }
 
  
注:f = &function;中,操作符&可以省略,因为函数名在被使用时总是由编译器把它转换为函数指针,&操作符只是显示地说明了编译器将隐式执行的任务。

4.函数指针作为结构体成员

     结构体成员可以是指针变量,而函数指针为指针变量。函数指针可以作为结构体成员。
例:
#include 
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
",str2); //while(1); return 0; } char *function(char *s1) { return s1; }

注意:構造体変数が関数ポインタを呼び出す場合は、一般的な関数ポインタとは異なり、前例ではstr 2=(*strf 1.f)(str 1);str 2=strf 1とする.f(str1);どちらでもいいです.
5.typedefと関数ポインタ
例えば:typedef int(*fp)(int);int(*)(int)がデータ型であると理解され、typedef int(*fp)(int)である.このデータ型の別名をfpとして再取得すると,int,charのように使用できるようになる.のように
fp function;ポインタ変数functionが定義されます.