Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >函数指针和指针函数用法和区别

函数指针和指针函数用法和区别

作者头像
全栈程序员站长
发布于 2022-06-25 06:06:39
发布于 2022-06-25 06:06:39
23400
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

前言

函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,特别是刚开始学习这门语言的童鞋,估计碰到这些东西就已经要崩溃了,然后好不容易死记硬背下来应付考试或者面试,然后过了几天发现,又是根本不会用,也不知道该在哪些地方用,这就尴尬了。 今天这里只讲两个相对简单的,其实上面说那些太复杂的东西也真的很少用,即便是用了理解起来很麻烦,所以莫不如先深刻理解这两个比较容易的,并且项目中比较常用到。

正文

先来看看两者的定义以及说明。

指针函数

定义

指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:*类型标识符 函数名(参数表)

这似乎并不难理解,再进一步描述一下。 看看下面这个函数声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int fun(int x,int y);

这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值。 接着看下面这个函数声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int *fun(int x,int y);

这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

这样描述应该很容易理解了,所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。

指针函数的写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,int y);

这个写法看个人习惯,其实如果*靠近返回值类型的话可能更容易理解其定义。

示例

(由于本人习惯于 Qt 中进行开发,所以这里为了方便,示例是在 Qt 工程中写的,其语法是一样的,只是输出方式不同) 来看一个非常简单的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct _Data{
    int a;
    int b;
}Data;

//指针函数
Data* f(int a,int b){
    Data * data = new Data;
    data->a = a;
    data->b = b;
    return data;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //调用指针函数
    Data * myData = f(4,5);
    qDebug() << "f(4,5) = " << myData->a << myData->b;

    return a.exec();
}

输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f(4,5) =  4 5

注意:在调用指针函数时,需要一个同类型的指针来接收其函数的返回值。 不过也可以将其返回值定义为 void*类型,在调用的时候强制转换返回值为自己想要的类型,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//指针函数
void* f(int a,int b){
    Data * data = new Data;
    data->a = a;
    data->b = b;
    return data;
}

调用:
Data * myData = static_cast<Data*>(f(4,5));

其输出结果是一样的,不过不建议这么使用,因为强制转换可能会带来风险。

函数指针

定义

函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。 声明格式:类型说明符 (*函数名) (参数) 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int (*fun)(int x,int y);

函数指针是需要把一个函数的地址赋值给它,有两种写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun = &Function;
fun = Function;

取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。

调用函数指针的方式也有两种:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = (*fun)();
x = fun();

两种方式均可,其中第二种看上去和普通的函数调用没啥区别,如果可以的话,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数。当然,也要看个人习惯,如果理解其定义,随便怎么用都行啦。

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int add(int x,int y){
    return x+y;
}
int sub(int x,int y){
    return x-y;
}
//函数指针
int (*fun)(int x,int y);

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //第一种写法
    fun = add;
    qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ;
	//第二种写法
    fun = &sub;
    qDebug() << "(*fun)(5,3) = " << (*fun)(5,3)  << fun(5,3)return a.exec();
}

输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(*fun)(1,2) =  3
(*fun)(5,2) =  2 2

上面说到的几种赋值和调用方式我都分别使用了,其输出结果是一样的。

二者区别

通过以上的介绍,应该都能清楚的理解其二者的定义。那么简单的总结下二者的区别:

定义不同

指针函数本质是一个函数,其返回值为指针。 函数指针本质是一个指针,其指向一个函数。

写法不同

指针函数:int* fun(int x,int y); 函数指针:int (*fun)(int x,int y); 可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。 再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

用法不同

上面已经写了详细示例,这里就不在啰嗦了。

总而言之,这两个东西很容易搞混淆,一定要深入理解其两者定义和区别,避免犯错。

另外,本文都是针对普通函数指针进行介绍,如果是C++非静态成员函数指针,其用法会有一些区别,在另外一篇博客中单独介绍,文章在这里

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152159.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
指针函数和函数指针(附实例详解)
指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
全栈程序员站长
2022/06/25
3.5K0
指针函数和函数指针(附实例详解)
C语言 函数指针和指针函数及Main()函数
指针函数 定义 指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:类型标识符 *函数名(参数表)
全栈程序员站长
2022/06/25
7680
C语言 函数指针和指针函数及Main()函数
C/C++函数指针与指针函数
上面一个 4GB 的内存可以存放 2^32 字节的数据。左侧连续的十六进制编号就是内存地址,每个内存地址对应一个字节的内存空间。而指针变量保存的就是这个编号,也即内存地址。
C语言与CPP编程
2020/10/20
2.6K0
函数指针
下面为Qt中的c语言代码: 函数名地址,变量地址等在vs中会一直变,因为每次启动程序都要重新分配内存,在qt中不会变,所以可以直接对函数名地址进行强制类型转换
大忽悠爱学习
2022/05/05
2770
函数指针
【C/C++教学】浅谈指针函数和函数指针
在小编被指针函数和函数指针苦苦折磨了long time之后,灵感突发,在查阅相关资料和总结自己的学习心得之时写了此文,有不足之处请多多指出!
短短的路走走停停
2019/05/14
4400
指针函数和函数指针区别
函数指针是指向函数的指针。它存储了函数的地址,允许在运行时动态地选择要调用的函数。函数指针允许在代码中间接地调用不同的函数。它是一个指针,可以指向函数,并用于调用该函数。
SarPro
2024/02/20
1610
指针函数和函数指针「建议收藏」
指针函数和函数指针是C语言里两个比较绕的概念。但是不仅面试题爱考,实际应用中也比较广泛。很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针、函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。 其实如果理解了这些概念的本质,是不需要死记硬背的,理解起来也比较容易。
全栈程序员站长
2022/06/25
5460
指针函数和函数指针「建议收藏」
c专题之指针---函数指针与指针函数与的区别用法
下面我们先来看最后一位网友的解释,怎么觉得他有道理呢,于是乎我自己用代码测试了一下,发现在定义结构体时,你在结构体里面没有放任何数据类型的定义,这个时候结构体不占用内存大小的(为啥会出现这种情况,我的理解是结构体类型是我们人为定义的一种(符合计算机的)数据类型),一般书上会叫复合类型,看书看的最多是这个叫法(那是因为后面结构体里面定义的各种数据类型的变量,甚至函数定义,所以这个结构体就像一个“黑洞”一样,当有数据类型被吸去,后面就可以一直吸东西,但是这个“黑洞”大小不能超过计算机所规定的内存大小的,这里纯属是个人的理解,如有理解不切当的地方,可以批评指出,非常欢迎您的批评意见);下面我们来看来代码来说话(其实下面我也写了空数组,就是在定义的时候,没有初始化数组元素大小,但是数组还是占用内存空间大小的,这是因为在数组类型定义的时候,计算机已经给它分配的内存大小):
用户6280468
2022/03/18
7230
c专题之指针---函数指针与指针函数与的区别用法
C语言中函数指针和回调函数的详解
函数指针:指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
全栈程序员站长
2022/06/25
8690
C语言中函数指针和回调函数的详解
函数指针介绍及其用法
本文介绍了函数指针和指针函数的相关内容,包括函数指针的声明方法、函数指针的类型、函数指针的用途、函数指针的声明方式以及注意事项。
Christal_R
2017/12/25
6640
函数指针介绍及其用法
一看就会的C语言笔记——指针函数、函数指针、回调函数
//函数返回值必须用同类型的变量来接受,也就是说,指针函数的返回值必须赋值给同类型的指针变量。
诸葛青云
2018/09/22
2.6K0
一看就会的C语言笔记——指针函数、函数指针、回调函数
C/C++ 函数指针
由于虚函数的存在,所以在在类的成员函数指针在调用的时候需要传入类的实例化后的对象,用于找到虚函数在内存中的函数体开始的地址。
mySoul
2019/01/22
9280
函数指针和函数指针数组及其应用
这是一个基础的不能再基础的例子。相信学过指针的都能看得懂。P是一个指针,指向a。a 是一个整形变量。
全栈程序员站长
2022/09/14
7970
C语言指针函数和函数指针区别
C和C++中经常会用到指针,和数据项一样,函数也是有地址的,函数的地址是存储其机器语言代码的内存的开始地址。
全栈程序员站长
2022/06/25
8420
c++ 函数指针
声明指针时,必须指定指针指向的数据类型,同样,声明指向函数的指针时,必须指定指针指向的函数类型,这意味着声明应当指定函数的返回类型以及函数的参数列表。
全栈程序员站长
2022/06/25
5180
【嵌入式开发】C语言 命令行参数 函数指针 gdb调试
作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshulia
韩曙亮
2023/03/27
6530
【嵌入式开发】C语言 命令行参数 函数指针 gdb调试
NDK启航篇——C语言基础(函数指针)
昨天介绍了指针类型、空指针、指针运算,今天来写一下函数指针 函数指针 函数指针的定义:函数的返回值类型(函数指针的名称)(函数的参数列表) 获取函数的地址,可以直接通过函数名获取与加&(取地址符)函数名称一样 //尖括号代表系统类库,std表示标准,io表示输入输出 引入标准输入输出 #include<stdio.h> //lib表示类库 引入标准类库 #include<stdlib.h> //windows系统标准头文件 #include<windows.h> void dialog(){ //win
longzeqiu
2020/04/01
4560
详解C语言指针函数、函数指针、函数指针数组「建议收藏」
指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数”。
全栈程序员站长
2022/06/25
2.1K0
【说站】c语言中常规函数和指针函数区别
以上就是c语言中常规函数和指针函数区别,希望对大家有所帮助。更多C语言学习指路:C语言教程
很酷的站长
2022/11/24
3370
C语言-内联函数、递归函数、指针函数
这篇文章介绍C语言的内联函数、递归函数、函数指针、指针函数、局部地址、const关键字、extern关键字等知识点;这些知识点在实际项目开发中非常常用,非常重要。
DS小龙哥
2022/01/07
6920
相关推荐
指针函数和函数指针(附实例详解)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验