C语言进阶:指针的进阶(4)

 更新时间:2021年09月02日 14:49:09   作者:AKA你的闺蜜  
这篇文章主要介绍了C语言指针详解及用法示例,介绍了其相关概念,然后分享了几种用法,具有一定参考价值。需要的朋友可以了解下

函数指针

函数指针的定义

整型指针存放整型的地址;数组指针存放数组的地址;那么类比可得,函数指针存放函数的地址。

显然,函数指针指向函数,存放函数的地址。搞懂函数指针,先了解函数的地址。

在这里插入图片描述

&函数名或函数名代表函数地址,与&数组名和数组名略有不同,&函数名和函数名完全一致。

函数的地址必然要放到函数指针里,函数指针的类型该如何写呢?(以Add函数为例)

//整型指针
int* pa = &a;
//字符指针 
char* pc = &ch;
//数组指针
int(*pa)[10] = &arr;
//函数指针 - 存放函数地址
int(*pf)(int, int) = &Add;

函数指针的类型

int Add(int x, int y);
//1.
int(*pf)(int, int) = &Add;
//2.
int *pf(int, int) = &Add;

倘若,去掉括号int* pf(int, int),pf就变成函数名,返回类型是int*。所以指针必须带括号。

前文已交代,指针,去掉指针名和*就是指针所指向的变量类型。

  • 整型指针,去掉*和指针名,即为整型变量类型int。字符指针,为字符类型char。数组指针,去掉后为数组类型int[10]。
  • 函数指针,去掉*和指针名,即为函数的类型int(int,int)。

总结

  • 去掉指针名pf,即为指针类型int(*)(int, int)
  • 去掉指针名pf和*,即为指针所指向的函数类型为int(int, int)

函数指针的使用

计算机硬件程序经常通过调用地址的方式来调用函数,因此需要使用函数指针调用函数。

int Add(int x, int y)
{
	return x + y;
}
int main()
{
    //1.
    int(*pf)(int, int) = &Add;//函数指针指向Add函数
    //2.
    int(*pf)(int, int) = Add;
	
    //1.
	int ret = (*pf)(2, 3);
	//2.
    int ret = pf(2, 3);
	
    printf("%d\n", ret);
	return 0;
}

前面已经交代,&函数名和函数名都是函数的地址,完全等价。所以两种初始化函数指针的方式都可以。

既然函数名Add可以直接赋值给函数指针pf,说明二者等价。函数指针名pf不解引用也可以使用,*在此处形同虚设,甚至于不写或写多个都并无大碍,仅为理解。

既然函数名也是函数地址,所以对其解引用也是可以的。我们甚至可以这样写,但仅限娱乐,没有必要。

Add(2, 3);//1
(*Add)(2, 3);//2
(*&Add)(2, 3);//3

Example

解释下列代码

//1.
(*(void(*)())0)();
//2.
void (*signal(int, void(*)(int)))(int);

在这里插入图片描述

1.void(*)()是函数指针类型,放在( )0中,也就是把0强制转换成地址,该地址处存放一个函数其类型为void(*)(void)

2.这样(void(*)())0就变成了指针,指向该地址的函数,且对其解引用访问此函数。

3.(*(void(*)())0)也相当于(*pf),通过函数指针解引用代替函数名,函数名后面带上();,相当于(*pf)();也就是一次不传参的函数调用。

在这里插入图片描述

1.signal先和()结合,说明signal为函数名,其后(int, void(*)(int)),为其参数列表。

2.去掉函数名称和参数列表,剩下的void(*)(int)就是返回类型,所以是一次函数声明。

void (* signal(int, void(*)(int)) ) (int);

typedef void(* pf_t)(int);//typedef简化代码
pf_t signal(int, pf_t);

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C++实现简单学生管理系统

    C++实现简单学生管理系统

    这篇文章主要为大家详细介绍了C++实现简单学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++超详细梳理IO流操作

    C++超详细梳理IO流操作

    当程序与外界进行信息交换时,存在两个对象,一个是程序中的对象,另一个是文件对象。流是信息流动的一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动
    2022-07-07
  • C++使用一个栈实现另一个栈的排序算法示例

    C++使用一个栈实现另一个栈的排序算法示例

    这篇文章主要介绍了C++使用一个栈实现另一个栈的排序算法,结合实例形式分析了C++借助辅助栈实现栈排序算法的相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • 深入浅析C语言中堆栈和队列

    深入浅析C语言中堆栈和队列

    这篇文章主要介绍了深入浅析C语言中堆栈和队列的相关资料,需要的朋友可以参考下
    2016-06-06
  • 结合C++11新特性来学习C++中lambda表达式的用法

    结合C++11新特性来学习C++中lambda表达式的用法

    这篇文章主要介绍了C++中lambda表达式的用法,lambda表达式的引入可谓是C++11中的一大亮点,同时文中也涉及到了C++14标准中关于lambda的一些内容,需要的朋友可以参考下
    2016-01-01
  • C/C++中多态性详解及其作用介绍

    C/C++中多态性详解及其作用介绍

    这篇文章主要介绍了C/C++中多态性(polymorphism)详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C 语言基础教程(我的C之旅开始了)[九]

    C 语言基础教程(我的C之旅开始了)[九]

    C 语言基础教程(我的C之旅开始了)[九]...
    2007-02-02
  • C程序和C++程序之间的互相调用图文教程

    C程序和C++程序之间的互相调用图文教程

    这篇文章主要给大家介绍了关于C程序和C++程序之间互相调用的相关资料,我们平常在刷题的时候,难免遇到实现多组输入这样的问题,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Qt使用QCustomPlot的实现示例

    Qt使用QCustomPlot的实现示例

    QCustomPlot是一个基于Qt C++的图形库,用于绘制和数据可视化,并为实时可视化应用程序提供高性能服务,本文主要介绍了Qt使用QCustomPlot的实现示例,感兴趣的可以了解一下
    2024-01-01
  • Qt QDateTime计算时间差的实现示例

    Qt QDateTime计算时间差的实现示例

    本文主要介绍了Qt QDateTime计算时间差的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论