C++ 函数指针以及指针函数以及原理

一、简介

函数指针本质是一个指针,指向函数(首地址)的指针变量

指针函数本质是一个函数,只是这个函数返回的是一个指针。

如何来判断是函数指针还是指针函数呢????

最简单的方法就是通过看函数名前面的“*” 是不是别() 括进去了,如果是进去了,就是函数指针,反之则是指针函数

 int  * func(int a,int b); 这个就是指针函数

 二、函数指针

这个指针执行的是一个函数,我们可以用这个指针来调用这个函数

声明格式:类型说明符 (*函数名)(参数)

// 定义一个很简单的函数指针
typedef int (*Calc)(int a, int b);

 直接调用:直接通过函数名来调用

简接调用:通过函数指针来调用

有两个方法:

int  add(int a, int b)
{
    return  a + b;
}

int  sub(int a, int b)
{
    return  a - b;
}

直接调用:

   int  x = 200;
    int y = 2;
    int z = 0;
    z = add(x,y);  // 直接调用
    printf("%d+%d=%d\n", x, y, z);

简接调用: a 先声明一个指针函数

// 定义一个很简单的函数指针
typedef int (*Calc)(int a, int b);

调用:

// 简接调用
    Calc func1 = &add;
    Calc func2 = ⊂
    z = func1(x, y);
    printf("%d+%d=%d\n",x,y,z);


    z = func2(x, y);
    printf("%d+%d=%d\n", x, y, z);

void (*fptr)();
  把函数的地址赋值给函数指针,可以采用下面两种形式:
  fptr=&Function;
  fptr=Function;
  取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
 可以采用如下两种方式来通过指针调用函数:
 x=(*fptr)();
 x=fptr();
  第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子:

void (*funcp)();
void FileFunc(), EditFunc();
int main()
{
funcp = FileFunc;
(*funcp)();
funcp = EditFunc;
(*funcp)();
}
void FileFunc()
{
printf("FileFunc\n");
}
 
void EditFunc()
{
printf("EditFunc\n");

}

这个是一个最简单的函数指针,

三、指针函数

是一个带指针的函数,本质是一个函数,返回的是一个指针类型,指针函数一定是返回值的 ;

类型标志符  * 函数名(参数列表);int  * func(int a );


int*   func(int a ,int b);  // 声明一个指针函数

int* func(int a ,int b)   // 指针函数的实现
{
	int* p = (int*)malloc(sizeof(int));
	printf("指针函数中的 p =0x%x  \n",p);
	memset(p,0,sizeof(int));
	*p = a * b;
	printf("*p=%d\n",*p);
	return  p;  //返回这个指针
}
int main()
{
	int* p1 = NULL;
	p1 = func(2,3);
	printf("main      p1= 0x%x  \n", p1);  // 打印地值
	printf(" main     *p1=%d\n", *p1);
 return  0;


}
#endif
float  * func2(int a );
float  * p;
p=func2(19);

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值