函数及结构体
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。