百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

C++函数指针深入理解(c++函数指针和指针函数)

citgpt 2024-07-10 14:45 12 浏览 0 评论

写在文章前

在写这篇文章之前我想让大家看三个函数的申明:

int p(int a,int b);

C++函数指针深入理解(c++函数指针和指针函数)

int *p(int a,int b);

int (*p)(int a,int b);

我们先看int p(int a,int b)和int *p(int a,int b);我们同时声明这两个函数看系统会报什么错误:无法重载仅按返回类型区分的函数。这说明什么?首先第一:这个两个函数同名,第二,返回值类型不同。因为C++是不支持仅按返回值不同重载函数的,这点大家需要注意。下面这个报错就告诉我们,这两个就是一个返回int的p函数,一个是返回int*的p函数。

再看同时声明int p(int a,int b);和int (*p)(int a,int b);会出现什么:声明与1IntelliSense: 声明与 "int p(int a, int b)" (已声明 所在行数: 8) 不兼容。为什么加个括号就不一样了呢?报错是不兼容,说明int *p(int a,int b)和int (*p)(int a,int b);是有很大区别的。

int *p(int a,int b)是正常的函数声明,int (*p)(int a,int b)是函数指针的声明

理解函数指针

首先从函数指针的写法上来理解:我们还是看int func(int a, int b)和int (*p)(int a,int b);第一:我们得将int (*p)(int a,int b)看成是在声明一个返回int类型的函数(int a, 和int b)是参数表,(*p)就是与int func(int a, int b)中的func一样,如果大家对python的万物皆对象思想有了解的话应该知道函数也是对象,那么*p就可以看成一个对象。我前面的文章有写过一篇文章讲的是如何理解C++的指针,里面讲到“*”号就是取地址的值,“&”号就是取对象的地址。那么回到函数指针,如果(*p)理解的是对象,那么反过来p指向函数对象的指针变量对吧。在声明时,p是不指向任何函数的,可以理解为指向Null。

函数指针的使用

首先说一下函数指针有什么用:

假设现在有一个方法funcA();这个方法里面有很多行代码,并且在其中会调用另外某类方法(不确定是哪个,此例是funcB和funcC),如下:

int funcB()

{

return 1 ;

}

int funcC()

{

return 2 ;

}

int funcA(int a,int b)

{

。。。。。。//假设此处有N行代码

int d = funcB(或者funcC) ;

。。。。。。//假设此处有N行代码

return a+b+c + d;

}

如果你现在有个项目可能会在很多处调用funcA(),并且每处需要funcA()中调用的方法都不同,这怎么弄呢,你不会想把funcA()的方法体每次都copy然后改funcB()或者funcC吧?那么,有的同学就会想,能不能讲函数也当成funcA()的参数传进去呢?bingo,恭喜你,有了创造思维,所以函数指针就因此而生。

那么函数指针怎么用呢?

还是拿上面那个例子,那么funcA()函数就的能传递一个函数进来,这就靠函数指针,所以我们先要申明一个函数指针:有几个要点:一、你要传递的函数返回值是什么?而你要传递的函数的参数有哪些。因为你的指针声明是需要跟你要传递的函数一一对应的。这里为了全面体现对funcB()和funcC()做些改变:

int funcB(int a)

{

return a ;

}

int funcC(int a)

{

return a +1;

}

那么声明的函数指针就是int (*p)(int x);

函数funcA()改为:

int funcA(int a,int b,int (*p)(int x))

{

return a+b+p(a);

}

参数里面的int (*p)(int x)就是我们要传的函数的形式参数。

理解函数指针赋值

我们在mian()函数里调用:

p = funcB ;

cout<<funcA(1,2,p)<<endl;

p = funcC ;

cout<<funcA(1,2,p)<<endl;

这里p = funcB ;和p = funcC 是什么意思呢?首先这里要说一下:每一个函数都占用一段连续的内存单元,它们有一个起始地址。怎么样有没有感觉这种存储方式很熟悉,对,数组也是类似的存储的。那么我们指针跟数组的赋值是怎么样的呢?

int arr[2] = {} ;

int *pArr ;

pArr = arr ;

在数组中数组名就代表着数组的起始地址,那么在指针和函数的赋值中也是同样的道理,函数名就代表着函数内存的起始地址也就是函数入口的地址;那么你pArr[1]这样的写法可以,那么在funcA中我函数指针p(a)这样调用当然也没问题啦!

调用图示如下:

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: