函数指针:
函数指针是一个指向函数的指针。而每个函数在编译的时候都会有个入口地址,这个入口地址就是函数指针所指向的地址。
使用方法:
如下代码:
#include<iostream>
//定义了个简单的两个int型整数相加的函数
int add(int a, int b) {
return a + b;
}
/*
测试调用幻术add来计算a+b的值
函数第一个参数就是个函数指针,声明方法:返回值类型 ( * 指针变量名) ([形参列表])
后面的“形参列表”表示指针变量指向的函数所带的参数列表
*/
void testRezult(int(*addd)(int, int), int a, int b) {
int rezult = addd(a, b);
printf("%d", rezult);
}
int main() {
testRezult(add, 3, 5);
system("pause");
return 0;
}
注意:
①函数指针中(*指针变量名)中的括号不能省略,并且指针变量名不必跟原函数名字一样(这段代码中的原函数名为add)
②[参数列表]是可选项,可以不写
指针函数:
指针函数指的是 返回值是指针的函数。
例如:
#include<iostream>
char *func()
{
static char a[20] = "Hello,World.";
return a;
}
int main() {
char *a = func();
printf("%s", a);
system("pause");
return 0;
}
运行结果:
函数func()就是个指针函数,因为它返回的是一个char类型的指针
注意:
func()函数中如果不把char字符数组定义为静态变量static的话(局部静态变量实际上也把数据加载到全局数据段中,相当于定义了个全局变量),那么数组a的作用域只能在函数体内,因此虽然return 的还是当初定义数组a的地址,但地址上的值早就被清空,所以如果要将这个指针函数返回给某个指针,然后再输出这个指针所指向这块地址的内容,这样根本得不到想要的“Hello,World!“的答案,而输出时就会打印出未初始化的栈(或堆)空间的内容(在VS里面会输出”烫烫烫)。(指针函数实际上返回的是一个指针,而指针的内容是指向一块地址)
如果func()函数不是指针函数,返回的只是个字面常量值,就能正常返回数值。