目录
1.指针函数
本质上是一个函数,返回值是一个指针类型
#include <stdio.h>
int *my_add(int a, int b){
int temp = a+b;
printf("func:&temp = %p\n", &temp);
return &temp;//不能返回局部变量的地址
//因为局部变量的生命周期在函数结束时就结束了
//所占用的空间会被操作系统回收
//回收后再访问 就是非法访问了 段错误
}
int value;
int *my_add2(int a, int b){
value = a+b;
return &value;//可以返回全局变量的地址
}
//也可以返回 static 修饰的局部变量的地址
//也可以返回 由函数的参数传递进来的地址
//如 strcpy 函数返回的 是 dest
int main(int argc, const char *argv[])
{
int x = 10;
int y = 20;
//int *ret = my_add(x, y);
//printf("ret = %d\n", *ret);//断错误
int *ret = my_add2(x, y);
printf("ret = %d\n", *ret);
return 0;
}
2.函数指针
本质上是一个指针,指向的是一个函数
eg:
int (*p)(int ,int );
一般用在回调函数中,将一个函数当做另一个函数的参数来传给函数
#include <stdio.h>
int my_add(int x, int y){
return x+y;
}
int my_sub(int x, int y){
return x-y;
}
//功能:实现两个int类型数据的运算
//当我们需要让两个数做运算时,先调用calculation函数,
//calculation 的第三个参数是一个 函数指针
//具体如何处理 取决于 调用calculation 函数时传递的第三个参数是什么
//然后通过 p 去调用 叫做回调函数
int calculation(int x, int y, int (*p)(int, int)){
return p(x, y);
}
int main(int argc, const char *argv[])
{
int a = 10;
int b = 20;
printf("%d\n",calculation(a, b, my_add));
printf("%d\n",calculation(a, b, my_sub));
return 0;
}