指针与函数

C语言指针 同时被 2 个专栏收录
10 篇文章 1 订阅
10 篇文章 0 订阅

1.指针可以调用函数

函数名本身就是一个指针(地址),这个地址就是函数的入口地址

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

int main()
{
	printf("%p\n", sum);

	system("pause");
	return 0;
}

可以发现,函数名就是一个地址

2.函数指针变量定义

格式:返回值 (*变量名)(参数1,参数2,,,参数n)

int sum(int a, int b) {}

int (*pSum)(int a, int b);  //函数指针变量,参数名可以省略

pSum = sum;  //给指针赋地址值
printf("%p\n", sum);

int(*pSum)(int, int);
pSum = sum;

printf("%p\n", pSum);

可以发现,两者地址相同

3.函数指针类型定义

格式:typedef  返回值 (* 类型名)(参数1,参数2,,,参数n);

typedef int(*PSUM)(int, int);
PSUM pSum2 = sum;
PSUM pSum3 = sum;

这样的好处就是,首先通过typedef定义一个函数指针类型PSUM,定义完后,PSUM就相当于一种新的类型,可以用此类型去定义其他函数指针变量,就不用每次都使用int(*pSum)(int, int);来定义一个函数指针变量

4.函数指针的使用

当成函数名一样来使用!

int(*pSum)(int, int);
pSum = sum;

typedef int(*PSUM)(int, int);
PSUM pSum2 = sum;

cout << sum(111, 222) << "  " << pSum(111, 222) << "  " << pSum2(111, 222) << endl;

得到的结果一致,使用的方式也和一般的函数调用一致

5.多级复杂函数指针

例如:int (* (* p)(int) )(int);

先看红色字体,p是一个函数指针,指向的函数A参数为一个int型,返回的值又是一个指针;然后返回的指针又是一个函数指针,指向的函数B参数为一个int型,返回的值是一个int型

#include <iostream>
using namespace std;

//定义一个函数,参数为int型,返回输入的倍数,也是一个int型
int fun0(int a)
{
	return a + a;
}

//定义一个函数指针类型,参数为一个int型,返回为int
typedef int(*PFUN)(int);

//该函数返回一个函数指针,参数为int型
PFUN fun(int a)
{
	return fun0;
}

int main()
{
	int(*(*p)(int))(int);
	p = fun;
	cout << p(111)(10) << endl;

	system("pause");
	return 0;
}

1)解释一下p(111)(10)的含义,首先p(111)调用函数fun,该函数返回函数fun0的地址,在函数的地址后面加上(10),表示输入参数10,最后返回20

2)解释一下为什么在定义函数指针类型的时候要返回值int,即typedef int (*PFUN)(int);里面的第一个int,如果使用float行不呢,答案肯定是不行的,这里的int依据的是定义函数指针p那里最左边的int,即int (* (* p)(int) )(int);里面的第一个int,要求返回int。如果我们改成float (* (* p)(int) )(int);那么相应的函数指针类型那里也要改成float,即typedef float (*PFUN)(int);最后在定义函数fun0那里,也要改成返回float型

 

 

  • 1
    点赞
  • 0
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值