指针用作函数参数、指针型函数和函数指针

2023-11-08

指针用作函数参数

以前我们学过的函数参数要么是基本数据类型的变量,要么是类的对象,又或者是数组名,前几讲学到的指针同样可以用作函数参数。

指针作函数形参时,我们调用此函数将实参值传递给形参后,实参和形参指针变量将指向相同的内存地址,那么在被调函数中对形参指针所指向的对象的改变会一样影响主调函数中实参指针指向的对象。

指针用作函数参数用什么作用呢?

其一,使形参指针和实参指针指向相同的内存地址,在被调函数中可以使用主调函数中的数据并可以改变主调函数中的数据,达到数据双向传递的效果。当然,前面讲过的引用也可以实现相同的作用。

其二,用指针作函数参数传递数据可以减少参数传递的开销,引用当然也可以实现这些。

其三,可以通过指向函数的指针来传递函数代码的首地址。

指针和引用很多时候作用是一样的,引用相对指针来说可读性更好,但有时还是需要使用指针。

把之前讲引用调用时的例程给大家修改下说明指针怎样用作函数参数:

#include<iostream>
using namespace std;
void Swap(int *a, int *b);
int main()
{
    int x=5, y=10;
    cout<<"x="<<x<<"    y="<<y<<endl;
    Swap(&x, &y);
    cout<<"x="<<x<<"    y="<<y<<endl;
    return 0;
}
void Swap(int *a, int *b)
{
    int t;
    t=*a;
    *a=*b;
    *b=t;
}

在这里插入图片描述
这里的Swap函数使用了指针作为参数,我们在调用时传入的是x和y的地址,分别传递给了a和b,然后在Swap内部改变了a和b指向的变量的值,而实际上它们指向的就是x和y,所以x和y的值发生了同样的改变。

指针型函数

函数都有自己的类型,除void类型的函数外都有自己的返回值。函数的返回值也可以是指针。返回值为指针类型的函数就是指针型函数。

普通函数只能返回一个变量或对象,但指针型的函数可以在函数调用结束时将大量数据从被调函数返回到主调函数中,这就是它的好处。

注意不要返回局部变量的地址,因为出了被调函数局部变量就释放了,返回的地址中存放的内容也是无效的了。

声明指针型函数的语法形式是:

数据类型 *函数名(参数表)
{
    函数体
}

数据类型指明了函数返回的指针的类型,“*”和函数名说明这是一个指针型函数,参数表是函数的形参列表。

函数指针

我们知道,程序运行时,数据会占用内存空间,实际上程序执行时代码也会调入内存,也会占用内存空间。函数名就是函数代码占用内存空间的首地址。函数指针就是用于存放函数代码首地址的变量。

我们也可以使用函数指针来调用函数,它和函数名实现的作用是一样的。声明方式也类似,也需要指明函数的返回值、形参列表,声明的语法形式是:

数据类型 (*函数指针名)(形参列表);

数据类型指明了函数指针所指向函数的返回值类型,函数指针名给出函数指针的名称,形参列表则说明了函数指针所指函数的形参类型和形参个数。

函数指针和一般的指针一样也要在使用之前先赋值,让它指向一个函数代码的首地址。为函数指针赋值的语法形式是:

函数指针名 = 函数名;

被指向的函数需要是声明过的已存在的,和函数指针必须具有相同的返回值类型、形参个数和形参类型。给函数指针赋值之后我们就可以通过函数指针名来调用它指向的函数了。

给大家一个函数指针的简单程序的例子:

#include <iostream>
using namespace std;

void show(int x)
{
    cout << x << endl;
}

void (*show_pointer)(int);    // 声明一个void类型的函数指针

int main()
{
    int a = 10;
    show_pointer = show;    // 函数指针show_pointer指向show
    show_pointer(a);        // 函数指针调用
    return 0;
}

在这里插入图片描述
上面例子中声明了一个void类型的函数指针:void (*show_pointer)(int);。我们通过给此函数指针赋值让其指向void类型的函数show,然后用函数指针实现了对函数的调用,输出了a的值。程序运行结果是:10。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指针用作函数参数、指针型函数和函数指针 的相关文章

  • Centos7设置静态IP

    sudo vi etc sysconfig network scripts ifcfg
  • Docker部署Elasticsearch+Kibana

    方式1 编写docker compose yml version 3 7 services elasticsearch image elasticsearch 7 10 1 container name elasticsearch 001
  • AMOP 实践 (普通话题)

    普通话题不需要额外创建 消息的发布直接根据 AmopMsgOut 的setTopic 方法设置 本次消息发布的 topic 本次示例为 Java SDK 的使用测试 且使用代码完成 Topic 的创建以及订阅 1 订阅话题 1 1 创建一个
  • 多模态信息检索流程,多模态信息检索的商业应用,多模态信息检索涵盖技术与未来发展

    多模态信息检索流程 1 收集不同类型的信息 如文本 图像 音频 视频等 2 对不同类型的信息进行处理和识别 如图像识别 语音识别等 3 将不同类型的信息转化为统一的表示形式 如向量表示或语义空间表示 4 进行信息匹配和检索 比较不同类型的信
  • servlet的会话管理

    在Servlet规范中 Servlet的会话管理技术主要有4种 URL重写 Cookie 隐藏表单域以及HttpSession 在Java Servlet API中 javax servlet http HttpSession接口封装了Se
  • 异星工厂服务器资源修改,异星工厂存档怎么改到别的地方 异星工厂存档位置修改方法_游侠网...

    异星工厂存档怎么改到别的地方想必有些小伙伴还不是很清楚的吧 所以呢今天小编就为大家带来了异星工厂存档位置修改方法 一起来了解一下吧 异星工厂存档位置修改方法 首先我们找到 Factorio异星工厂的安装目录 然后 找到一个叫做config
  • Angular 表单验证

    模板驱动验证 使用模板驱动验证需要依赖于原生的HTML表单验证器 Angular 会用指令来匹配具有验证功能的这些属性 原生的HTMl验证器主要分两种 通过语义类型来进行定义 通过验证相关的属性来进行定义 语义类型 Input type C
  • Autoregressive Models

    The autoregressive model is one of a group of linear prediction formulas that attempt to predict an output y n of a syst
  • Matplotlib-快速上手-2

    Matplotlib Advanced 概述 一 基本可操作对象 1 1 Lines对象 1 2 Axes对象 重要 1 3 Ticks对象 1 4 Legend对象 1 5 Figure对象 1 6 Savefig对象 1 7 小总结 二
  • RabbitMq中间件下载与安装(window版+Centos7)

    RabbitMQ下载与安装 window版 rabbitmq下载安装 小阿杰的博客 CSDN博客 https www cnblogs com easy5weikai p 16217858 html Centos7安装RabbitMQ 安装
  • C语言printf中的自增自减运行

    源程序 int main int i 0 printf d d d n i i i return 0 我们预期的结果应该是 0 0 0 但实际结果为 0 1 0 原理我也弄得不是很明白 我借鉴了几篇文章 理解到了计算的方法 大家都知道pri
  • 在datagridview中添加button按钮

    前言 Net的DataGridView控件中 提供了一种列的类型 叫 DataGridViewButtonColumn 这种列类型是展示为一个 按钮 可以给button赋予相应的text 并且 此button可以用来做处理事件的判断依据 D
  • Linux系统管理员非常使用的几款工具推荐

    1 ExplainShell com 命令解释 对于Linux用户来说每天都会写各种命令和脚本 那么你可以使用这个网站工具来查看命令式如何工作的 这样可以避免不必要的错误出现 也是一个很好的学习命令的方式 2 BashrcGenerator
  • 使用 Builder 构建对象

    遇到多个构造器参数时 要考虑使用构建器 当遇到成员变量较多的类时 使用构造方法初始化对象会使得代码的可读性以及规范性变差 比如想知道某个参数的含义时必须要查看构造方法的定义源码 而且如果不消息颠倒了参数的顺序 编译器可能也不会报错 可以使用
  • 【Java集合 4】java character

    Java学习路线 搬砖工逆袭Java架构师 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 扫描主页左侧二维码 加入群聊 一起学习 一起进步 欢迎点赞 收藏 留言 目录 一 前言 二 ASCII控制字符 三 AS
  • Oracle数据库的启动

    lsnrctl start 启动监听 sqlplus nolog SQL gt conn as sysdba SQL gt startup 启动数据
  • 提高性能 MSSQL百万数据量 值得注意的30条优化技巧

    1 对查询进行优化 应尽量避免全表扫描 首先应考虑在 where 及 order by 涉及的列上建立索引 2 应尽量避免在 where 子句中对字段进行 null 值判断 否则将导致引擎放弃使用索引而进行全表扫描 如 select id
  • JSP动态网页开发技术

    一 学习目标 1 JSP概述 2 JSP指令 3 JSP 隐式对象 二 重点知识 1 JSP概述 JSP是什么 1 JSP全称Java Server Pages 是一种动态网页开发技术 它使用JSP标签在HTML网页中插入Java代码 标签
  • android控制电脑,安卓手机远程控制电脑教程详解

    当我们出门在外 没有电脑在身边 但又急需远程处理电脑上的事务时 怎么办呢 自从锤子出了手机远程协助后 没有锤子的人就急了 这里有个可以让所有Android手机和ios手机实现远程协助功能的小技巧 能 远程控制 远程控制 远程控制 windo

随机推荐

  • 初始gensim

    1 import jieba 2 import gensim 3 from gensim import corpora 4 from gensim import models 5 from gensim import similaritie
  • 复制CSDN文章,去掉代码前面行号的方法(及一些正则表达式小技巧)

    分享一些平时工作中常用的正则表达式小技巧 一 去掉代码前面行号的方法 idongchen modify 2018 12 5 csdn的markdown解析器蛮恶心的文章整体复制下来总有行号在前面 可以用正则找到这些行号给去掉就好 带点的 s
  • sqli-labs(29-31)

    序 这三关都是双服务器问题 网上很多教程都只考虑了apache 其实是php apache jsp tomcat 环境的搭建已经写在了另外一篇博客中 这里再推荐一下一个大牛写得很好的博客 里面把每关的原理都讲得很清晰 但是他里面关于本关的原
  • CV-对比学习-模型:MoCo/SimCLR/BYOL/SimSiam

    很多大佬认为 深度学习的本质就是做两件事情 Representation Learning 表示学习 和 Inductive Bias Learning 归纳偏好学习 在表示学习方面 如果直接对语义进行监督学习 虽然表现很好 但是它需要很多
  • lvs负载均衡、LVS集群部署

    四 LVS集群部署 lvs给nginx做负载均衡项目 218lvs DR 负载均衡器 yum y install ipvsadm 安装这个工具来管理lvs 设置VIP192 168 142 120 创建ipvsadm的文件用来存放lvs的规
  • c语言 如何创建txt文件,C++文本文件读写操作详解

    前面章节中 已经给大家介绍了文件流对象如何调用 open 方法打开文件 并且在读写 又称 I O 文件操作结束后 应调用 close 方法关闭先前打开的文件 那么 如何实现对文件内容的读写呢 接下来就对此问题做详细的讲解 在讲解具体读写文件
  • MySQL基础---连接查询(等值连接与非等值连接)

    多个表格查询 笛卡尔乘积现象 表1有m行 表2 有n行 结果有m n行 发生原因在于没有有效的连接条件 如何避免 添加有效的连接条件 方法 分类方法 按照年代分类 sql192标准和sql199标准 功能 内链接 等值连接 非等值连接 自连
  • 学习日记——物联网云平台(乐鑫云平台)

    物联网云平台了解 1 物联网云平台 接收设备上报的数据 向设备下发数据 对数据进行转发 分析 计算 显示 管理设备等 2 常见的物联网云平台一般有 私有物联网云平台 假设某瓜农 为瓜棚装上了物联网温湿计 温湿度数据通过网络发送某台主机 这台
  • redis--11.1--操作--对列表类型,集合类型,有序集合类型进行键排序

    redis 11 1 操作 对列表类型 集合类型 有序集合类型进行键排序 1 命令 sort key alpha BY pattern LIMIT offset count GET pattern GET pattern asc desc
  • javax.validation.constraints注解

    文章目录 概要 常用的注解 其他注解 小结 概要 javax validation constraints是Java Validation API中的一个包 它提供了一组注解 用于在Java代码中进行数据校验和验证 该包中定义了多个注解 用
  • LR(1)分析表-语法树-四元式

    这学期的编译原理终于学完了 不愧是号称最难的科目 要用C 从头到尾实现一下小型编译器 还真不容易啊 不过总算是做完了 首先上文法 这个文法是根据上一篇博客简化的 但还是有一点问题的 暂时发现有一个地方不符合LR1的规则 函数的返回类型如果是
  • 【ACOUG】Oracle技术爱好者的乐园

    ACOUG 的含义为 All China Oracle User Group http www acoug org 该组织是为了更好的提供一个Oracle用户的交流和活动平台 组织和发起一些公益性质的活动 这个组织是Eygle和Kamus发
  • 简单文件数据库-模拟图书馆管理系统-西安电子科技大学大一程序基础设计课程设计作业

    命令行参数如下 Libsim a u xxxx 第一个参数为可执行程序名称 第二个参数为用户身份 a表示管理员 u表示读者 第三个参数为用户名 问题分析 由于无法直接在文件中插入数据 不是简单覆盖 固采用将文件数据提取为链表的方法 对链表进
  • Spring源码系列:Bean的加载

    Spring源码系列 Bean的加载 前言 一 Bean的加载 1 1 FactoryBean的使用 案例 FactoryBean的使用和定义 1 2 缓存中获取单例Bean 1 2 1 Spring解决循环依赖的原理 1 以A类的角度来观
  • 中间件Redis简介

    Redis概述 什么是redis Redis是一种支持key value等多种数据结构的高速缓存数据库 用C语言编写 可以用于缓存 事件发布和订阅 高速队列等场景 提供字符串 哈希 列表 队列 集合直接存存取 基于内存 可以持久化 为什么要
  • DeFi撑爆以太坊基础设施,近1亿美元BTC已进入以太坊生态

    编译 隔夜的粥 以太坊和DeFi在过去几个月里经历了爆炸性的增长 这已经不是什么秘密了 在过去2 3周里 它们已达到了一个全新的水平 各种应用的使用量增长如此之快 以至于给以太坊主要基础设施提供商TheGraph带来了巨大压力 导致其支持的
  • C中字符串操作

    字符串可以看作一个数组 它的每个元素是字符型的 例如字符串 Hello world n 图示如下 H e l l o w o r l d n 0 15个字符 注意每个字符串末尾都有一个字符 0 做结束符 这里的 0是ASCII码的八进制表示
  • 初识运营,明晰运营的学习路径

    关于运营的思考 问题1 运营是什么 运营到底是做什么工作的 如题 到底什么是运营 为什么我们所接触到的很多运营都不太一样 有的运营就是每天追寻互联网热点 加班加点的写文案 有的运营每天就是在不同的群里和成千上万的人唠嗑 有的运营活跃在不同的
  • html获取text输入框中的值

    1 在head中引用jquery 2 定义一个text输入框
  • 指针用作函数参数、指针型函数和函数指针

    指针用作函数参数 以前我们学过的函数参数要么是基本数据类型的变量 要么是类的对象 又或者是数组名 前几讲学到的指针同样可以用作函数参数 指针作函数形参时 我们调用此函数将实参值传递给形参后 实参和形参指针变量将指向相同的内存地址 那么在被调