1.函数指针
1.1 函数的返回值类型为指针类型
将函数内部的合法地址通过返回值 返回给函数外部使用
注意:函数不要返回普通局部变量的地址
分析:
在这段代码中,函数getAddr()
返回一个指向局部变量data
地址(作用域是函数内部)的指针,然后在test04()
函数中将返回的指针赋值给p
。然而,这样做会导致段错误。
原因在于getAddr()
函数返回指向data
的指针,而data
是一个局部变量,当getAddr()
函数执行完毕后,data
将被销毁,这意味着p
将指向一个已经释放的内存地址。这种情况称为悬垂指针(dangling pointer)
解决:使用static修饰静态变量,不让其被释放
特别的:不同编译器有自己优化策略,我使用的QtCreator会出现这样的错误,有人使用VS或者Dev时候这时候编译器会自动优化这个段错误。
1.2 函数指针的定义
1.形式
函数指针的基本定义形式为:
return_type (*ptr_name)(parameter_list)
注:前面()括号不能去掉,去掉就是普通函数的定义形式了
其中return_type
是函数返回类型(int、char等等),ptr_name
是指针变量的名字,parameter_list
是函数的参数列表。
例如,对于一个返回int
类型并且不接受任何参数的函数指针的定义可以如下所示:
int (*ptr)();
函数名 代表函数的入口地址
函数指针:本质是一个指针变量 只是该变量保存的是函数的入口地址
//函数指针 p只能保存 有两int形参以及int返回值 的函数入口地址
int (*p)(int,int) = NULL;
2.函数指针变量注意
函数指针变量,不要+1 无意义(加1跳过一个函数?没有意义)
禁止对函数指针变量取* 无意义(存在在代码区,我们使用函数指针是为了调用函数的)
int (*p)(int,int) = my_add;
*p会被编译器优化成p
函数指针变量 判断大小 > < 无意义
函数指针变量 可以赋值 p2=p1、
函数指针变量 可以判断相等 p2 == p1
3.使用typedef给变量取别名
2.为什么要使用函数指针
1.函数指针作为函数的参数
目的:为了让函数算法产生多样化
案例:设计一个计算加减乘除的算法,使用函数指针作为函数的参数