函数指针与指针函数
8.17.1 函数指针
函数名,就是函数的首地址。如果一个指针变量,存放的是函数的地址,那么就把这个指针叫做函数指针。定义函数指针有2中形式:
第一种,首先用typdef定义出函数指针的类型,然后,通过函数指针类型来定义函数指针
第二种,直接用函数的签名来定义函数指针
void print_int(int x)
{
printf("hello, %d\n", x);
}
typedef void (*F)(int x);//此处定义了一个函数指针类型F
int main(void)
{
int a =100;
void (*f1)(int x);
f1= print_int;//f1是指针定义出来的函数指针,把函数print_int赋值给f1
f1(a);
F f2= print_int; // f2是通过函数指针类型F定义出来的函数指针,把print_int赋值给f2。
f2(a);
print_int(a);
}
8.17.2 指针函数
指针函数:即返回指针的函数。比如下面的代码中,我们尝试着调用get_memory()获取一个内存,用来存放“hello
world“这个字符串,那么就可以将get_memory()设置成为一个返回指针的函数:
char *get_memory();
int main(void)
{
char *p = NULL;//p是指针,做为实参,初始值为NULL
p=get_memory();//通过该函数,为p分配一块内存。如何定义get_memory函数?
strcpy_s(p, 100,”hello world”);
printf(“%s\n”, p);
free(p);
p=NULL;
}
char *get_memory()
{
return (char *)malloc(100);
}
注意:指针函数不能返回局部变量的指针(地址),只能返回堆上内存的地址,或者函数参数中的内存地址。因为局部变量存放在栈上,当函数运行结束后,局部变量就被销毁了,这个时候返回一个被销毁的变量的地址,调用者得到的就是一个野指针。
注意下面几个定义的区别:
int f();//普通的函数
int *fpi();//指针函数
int (*pfi)();//函数指针