関数ポインタおよび構造体
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次ポインタです.
例:
注意:構造体変数が関数ポインタを呼び出す場合は、一般的な関数ポインタとは異なり、前例では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が定義されます.
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が定義されます.