返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言编程函数指针入门精讲教程
  • 381
分享到

C语言编程函数指针入门精讲教程

2024-04-02 19:04:59 381人浏览 安东尼
摘要

目录一、指针引子二、使用步骤1.取函数地址2.创建函数指针3.通过函数指针调用函数的两种方法三、函数指针进阶总结一、指针引子 示例:我们常常接触的指针大多有如下几类: 整形指针-存放

一、指针引子

示例:我们常常接触的指针大多有如下几类:
整形指针-存放整形地址,指向整形
字符指针-存放字符地址,指向字符
数组指针-存放数组地址(注意不是数组首元素地址),指向数组

由以上三个例子,我们能总结指针的共同点:存放某个类型变量的地址,指向那个类型的变量,但是在讲函数指针首先有一个问题:函数也有地址吗?我们用一段简单的代码来验证一下即可。


#include<stdio.h>
int Add(int x,int y)
{
   return x+y;
}
int main()
{
   printf("%p\n",&Add);
   return 0;
}

屏幕上打印出地址:

在这里插入图片描述

所以答案是有的,函数也存在地址,那么也就衍生出了今天的知识点-函数指针。

二、使用步骤

1.取函数地址

我们知道&数组名,取出的是数组的地址。单独一个数组名,取出的是数组首元素的地址。但是对于函数来说:函数名==&函数名

我们代码验证一下(示例):


#include<stdio.h>
int Add(int x,int y)
{
   return x+y;
}
int main()
{
   printf("%p\n",&Add);
   printf("%p\n",Add);
   return 0;
}

在这里插入图片描述

显然,打印出来的地址是一样的,但是这个时候也会有同学跳出来说:“那数组名和&数组名打印出来的地址还一样呢,但意义明显不一样啊”。但是你想想,函数也没有首元素等其他玩意啊,它就是它本身啊,它也不会出现什么函数首元素啊。

所以再次声明:
在函数指针这一块 函数名==&函数名,它的意义和值,都是一样的

2.创建函数指针

我们知道,数组指针用来存放数组地址,整形指针用来存放整形地址。。。函数指针也不例外,它用来存放函数地址,我们现在定义一个p来存放Add地址,那它的类型怎么创建?我们来看一下具体步骤:

1.p是一个指针对吧,给它一个*是不是必须的 p变成了 * p。为了确保 * 和 p结合(如果没有括号,*或者p有可能会与其他的一些符号结合,具体参见符号优先级)那我在 * p外面加一个括号便于观看也没有问题吧,也就是(*p)

2.那函数总得有参数啊,比如这里是Add(int x,int y)。参数x和y的类型是int
你指针指向的函数是不是要找一下它的参数。所以(*p)(int,int)

3.那函数还有一个性质啊,有没有返回值,要是有的话,类型呢? 这里以Add为例,它是返回int型,所以我们指针也返回int 型 即int(*p)(int,int)

到这里Add函数指针的类型就创建完成啦即为*int(p)(int ,int)

需要注意的是:不同函数的参数类型和返回值类型是不一样的,到时候需要根据不同函数对类型进行转换,这里只是以Add函数为例,其他函数以此类推

ps:一个快速判别类型的方法——去掉变量的名字,剩下的就是类型
代码如下(示例):


	int a = 10;//去掉a 类型int
	int arr[10] = { 0 };//去掉arr 类型int [10]
	int(*parr)[10] = &arr;//去掉parr 类型int(*)[10],数组指针,指向一个10int型元素的数组
	int(*pf)(int, int) = &Add;//去掉pf 类型int(*)(int,int)

3.通过函数指针调用函数的两种方法

法一:
我们平时在调用函数的时候,一般就是函数名( ,)然后把参数传进括号即可,那我们现在有函数指针了呀,指针怎么使用?p不是指向了函数Add嘛,我们用*解引用指针,得到的是地址里的东西,也就是说 *p==Add,用 * p(,)来传参也可以实现Add函数的调用。代码如下:


#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int ret = Add(2, 3);
	printf("%d\n", ret);//ret=5
	int(*p)(int, int) = &Add;//p是一个指向函数Add的指针
	ret = (*p)(3, 3);//ret=6
	//p指向Add,对p解引用就是Add
	//简言之:*p=Add
	//我们并不总是可以拿到变量,有时是拿到变量的地址
	//对应函数指针同样的道理,有时不直接给你函数,给你函数地址,就这样调用
	printf("%d\n", ret);
}

法二:
我们在二.1取函数地址那一块介绍了,在函数指针这一块,函数名==&函数名, 也就是说创建函数指针的时候可以这样写:int(*p)(int, int) = Add,Add是赋给了p啊,你也可以认为:p就是Add。你可以这样理解,法一是int(*p)(int, int) = &Add,是把Add的地址给p,所以用p来调用函数要解引用一下,但是法二p就是Add,那不用解引用了,直接调用。代码如下:


#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	//我们由前面的知识知道:函数add取地址时,add=&add
	int(*p)(int, int) = Add;//把Add赋给p,这里p即可看做Add
	//与法一不同的是,法一将&Add赋给p,p是Add的地址,所以要解引用,这里p就可以看做是Add本身,可以不解引用
	int ret = p(3, 6);
	printf("%d", ret);
}//如果是为了方便理解,一般是用第一种方法,如果是为了操作方便,可以用第二种方法

三、函数指针进阶

大家来看这样一个代码( * (void(*)() ) 0)(),乍一看非常复杂,我们来细化一下
1 . ( * (void( * )() ) 0)() 我们抽出加粗部分
这是我们熟悉的老朋友:void( * )(),这不就是一个函数指针嘛,该函数无参,返回类型void

2 . (void( * )() ) 0是什么?我们联想一下(int)3.14,不就是对3.14强制类型转换嘛,将3.14这个浮点型强制转换成整形。这里同样的道理,是将整形0强制转换成类型为void( * )()的一个函数指针

3 .现在有了(void( * )() ) 0,我们在这个东西前面加一个 *,这个是什么意思,我们知道(void( * )() ) 0已经被转换成一个指针(指针即地址)了,地址前面加一个 *表示解引用,取出地址里的东西,也就是找到了那个函数

4 .(void( * )() ) 0表示那个函数那再在后面加一个()即是对函数的调用,也就是( * (void(*)() ) 0)()

总结

提示:本文介绍了函数指针的原理和多种使用方法,对于函数指针想要进阶提升的小伙伴一定要认真研读本文中的进阶题目,指针是一个大头,但相信坚持不懈的你一定可以战胜它,加油!

更多关于C语言函数指针的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言编程函数指针入门精讲教程

本文链接: https://lsjlt.com/news/155225.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言编程函数指针入门精讲教程
    目录一、指针引子二、使用步骤1.取函数地址2.创建函数指针3.通过函数指针调用函数的两种方法三、函数指针进阶总结一、指针引子 示例:我们常常接触的指针大多有如下几类: 整形指针-存放...
    99+
    2024-04-02
  • C语言进阶教程之函数指针详解
    目录一、函数指针1.概念1.2函数指针的使用方法1.3练习巩固1.4小结一下二、阅读两段有趣的代码1.( *(void( *)( ))0 )( )2.void (* signal(i...
    99+
    2024-04-02
  • Go语言编程入门指南
    Go语言(Golang)是由Google开发的一种编程语言,它的设计简洁、高效,并且具有很强的并发特性,因此受到了许多开发者的青睐。本文将为您提供一份简单的Go语言编程入门指南,介绍基...
    99+
    2024-04-02
  • C语言超详细讲解指向函数的指针
    目录一、函数的指针二、指向函数的指针变量三、调用函数的两种方式四、指向函数的指针的作用五、用指向函数的指针作函数参数(重点)六、为什么要将指向函数的指针变量作为函数的形参(重点)一、...
    99+
    2024-04-02
  • Go语言快速入门指针Map使用示例教程
    目录1. 指针1.1 指针地址和指针类型1.2 指针取值1.3 空指针1.4 new 的使用1.5 new与make的区别2. Map2.1 什么是Mapkey,value存储has...
    99+
    2024-04-02
  • C语言入门篇--初识指针和指针变量
    1.指针 指针就是地址(即一个数据)。 2.指针变量 2.1概念 (1)指针变量是变量,是变量在内存中就会开辟空间,会有自己对应的的地址,有自己的变量大小。 (2)指针变量里放的内容...
    99+
    2024-04-02
  • C语言指针教程示例详解
    目录指针内存指针类型指针运算二级指针指针数组指针 指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作...
    99+
    2024-04-02
  • C语言基础指针详解教程
    目录1.1:概述1.1.1:内存1.1.2:内存1.1.3:指针和指针变量1.2:指针基础知识1.2.1:指针变量的定义和使用1.2.2:通过指针间接修改变量的值1.2.3:指针的大...
    99+
    2024-04-02
  • 从入门到精通:Python 函数教程
    Python 是一种非常流行的编程语言,其灵活性和易读性使其成为许多开发者的首选语言。在 Python 中,函数是一种非常重要的编程概念,可以帮助我们将代码分解为可重用的部分。本文将介绍 Python 函数的基础知识和高级概念,从入门到精...
    99+
    2023-06-29
    函数 教程 关键字
  • 如何入门并精通Go编程语言
    如何入门并精通Go编程语言 Go语言是一种由Google开发的开源编程语言,它具有高效、简洁、并发等特点,在近年来受到越来越多开发者的喜爱。对于想要学习和精通Go语言的人来说,本文将提...
    99+
    2024-03-10
    入门 go编程 精通 go语言 网络编程 标准库
  • C语言函数指针详解
    目录Introduction函数指针 Function PointersExercise 1:qsort中的函数指针Exercise 2:总结Introduction 上一个lab的...
    99+
    2024-04-02
  • C语言超详细讲解函数指针的运用
    目录前言计算器的例子回调函数转移表前言 前面我们学习了各种各样的指针类型,有些指针可以说是稀奇百怪,特别是函数指针,有些朋友可能觉得,函数指针有些多余,调用函数为什么要用指针调用,直...
    99+
    2024-04-02
  • C语言深入浅出分析函数指针
    我们先看一个代码: #include<stdio.h> void test() { printf("haha\n"); } int main() { printf("...
    99+
    2024-04-02
  • C语言编程const遇上指针分析
    const关键字 可以有很多用处,比如: #define ROW 10 就代表ROW的值恒为10,不可修改。 而 const int ROW=10; 也可以将值恒定,无法修...
    99+
    2024-04-02
  • C语言的数组指针与函数指针详解
    目录前言函数指针语法数组指针与指针数组总结前言 数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用。 函数指针语法 定义一个函数指针,并通...
    99+
    2024-04-02
  • C语言中怎么使用指针函数和函数指针
    本篇内容介绍了“C语言中怎么使用指针函数和函数指针”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、指针函数当一个函数声明其返回值为一个指针...
    99+
    2023-06-16
  • C语言中如何使用指针函数和函数指针
    这篇文章给大家介绍C语言中如何使用指针函数和函数指针,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、指针函数当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。格式:...
    99+
    2023-06-17
  • Python编程入门指南之函数
    目录Python编程:函数定义和调用函数向函数传递信息传递实参:位置实参传递实参:关键字实参传递实参:默认值传递列表禁止函数修改列表传递任意数量实参返回值返回简单值让实参可选返回字典...
    99+
    2024-04-02
  • C语言八道笔试题精讲带你掌握指针
    目录题目一题目二题目三题目四题目五题目六题目七题目八为了题目的准确性和我们一般学习过程中的习惯,这里所有的题目代码都是在 X86 环境(32 位平台)下运行的。 题目一 #inclu...
    99+
    2024-04-02
  • C语言函数指针怎么用
    这篇文章主要介绍“C语言函数指针怎么用”,在日常操作中,相信很多人在C语言函数指针怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言函数指针怎么用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!定义...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作