1.指针函数-本质是一个函数
返回值是指针的叫指针函数
注意:使用指针函数,不能返回指向栈区变量的指针。要自己申请内存(是堆区的,需要自己释放内存)
int* function()
{
int mn = 10; //mn:栈区变量
int* p = &mn; //p:指针,指向栈区变量
return p; //1.返回p 2.自动释放mn==>p变成了野指针
}
int main()
{
int* pa = function();
printf("%d\n", *pa);//10
printf("%d\n", *pa);//打印一个地址(释放mn==>p变成了野指针)
return 0;
}
2.函数指针 -本质是一个指针
1.指针本身的类型:指针指向的类型+*
2.指针指向的类型(函数本身的类型):
3.函数本身的类型:返回值类型+参数表
int add(int,int);
//函数本身类型是:int (int,int)
void func1()//函数类型为:void ()
{
printf("func1 is used\n");
}
void func2()//函数类型为:void ()
{
printf("func2 is used\n");
}
int func3(int a , int b)//函数类型是:int (int a,int b)
{
printf("func3 is used\n");
return 0;
}
int main()
{
//定义一个函数指针并赋值(两种方式给指向)
void (*p1_func1)()=&func1;
void (*p2_func1)()=func1;
//调用(两种方式)
(*p1_func1)();
p1_func1();
//效果都一样
//也可以用同类型的函数去赋值
p1_func1=func2;
//对于func3
int (*p3_func3)(int,int)=func3;
int (*p4_func3)(int,int)=&func3;
//调用
p3_func3(1,3);
(*p3_func3)(2,5);
//也可以使用typedef更方便
typedef int(*pfunc)(int, int);
typedef int func (int ,int);
//定义一个函数指针
pfunc p;
p=func3;
//调用
p(1,2);
//或者
func* p1;
p1=func3;
//调用
p1(1,2);
return 0;
}