当前位置: 首页 > news >正文

【时时三省】(C语言基础)指针变量作为函数参数

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省

函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。

下面通过一个例子来说明。

例题:

对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。

解题思路:

直接在主函数内交换指针变量的值,本题是定义一个函数swap,将指向两个整型变量的指针变量(内放两个变量的地址)作为实参传递给swap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。

编写程序:

运行结果:

程序分析:

swap是用户自定义函数,它的作用是交换两个变量( a和b )的值。swap函数的两个形参p1和p2是指针变量。程序运行时,先执行main函数,输入a和b的值(现输入5和9 )。然后将a和b的地址分别赋给int *变量pointer _ l和pointer _ 2,使pointer1指向a,pointer _ 2指向b,接着执行if语句,由于a < b,因此执行swap函数。注意实参pointer _ 1和pointer2是指针变量,在函数调用时,将实参变量的值传送给形参变量,采取的依然是“值传递”方式。因此虚实结合后形参pl的值为&a,p2的值为&b,这时pl和pointer1都指向变量a,p2和pointer _ 2都指向b。接着执行swap函数的函数体,使* pl和* p2的值互换,也就是使a和b的值互换。函数调用结束后,形参p1和p2不复存在(已释放),最后在main函数中输出的a和b的值已是经过交换的值( a = 9,b = 5 )。

解引用以后是直接改变a和b的值,如果没有解引用就是只改变指针变量的值

 

*p1就是a,是整型变量。而* temp是指针变量temp所指向的变量。但由于未给temp赋值,因此temp中并无确定的值(它的值是不可预见的),所以temp所指向的单元也是不可预见的。所以,对* temp赋值就是向一个未知的存储单元赋值,而这个未知的存储单元中可能存储着一个有用的数据,这样就有可能破坏系统的正常工作状况。应该将*p1的值赋给与* p1相同类型的变量,在本例中用整型变量temp作为临时辅助变量实现* pl和* p2的交换。

注意:本例采取的方法是交换a和b的值,而pl和p2的值不变。可以看到,在执行swap函数后,变量a和b的值改变了。

 

下面的函数能不能实现a和b互换

如果在main函数中调用swap函数:

swap ( a,b );

会有什么结果呢?

在函数调用时,a的值传送给x,b的值传送给y,执行完swap函数后,x和y的值是互换了,但并未影响到a和b的值。在函数结束时,变量x和y释放了,main函数中的a和b并未互换,也就是说,由于“单向传送”的“值传递”方式,形参值的改变不能使实参的值随之改变。

为了使在函数中改变了的变量值能被主调函( a ) ( b )数所用,不能采取上述把要改变值的变量作为参数的办法,而应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来,这样就实现了“通过调用函数使变量的值发生变化,在主调函数(如main函数)中可以使用这些改变了的值”的目的。

如果想通过函数调用得到n个要改变的值,可以这样做:

①在主调函数中设n个变量,用n个指针变量指向它们;

②设计一个函数,有n个指针形参。在这个函数中改变这n个形参的值;

③在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的值,也就是相关变量的地址传给该函数的形参;

④在执行该函数的过程中,通过形参指针变量,改变它们所指向的n个变量的值;

⑤主调函数中就可以使用这些改变了值的变量。

例题2:

对输入的两个整数按大小顺序输出。

解题思路:

尝试调用swap函数来实现题目要求。在函数中改变形参(指针变量)的值希望能由此改变实参(指针变量)的值。

编写程序:

运行结果: 

程序分析 :

从运行结果看,显然与原意不符。程序编写者的意图是:交换指针变量pointer _ 1和pointer _ 2的值,使pointer _ 1指向值大的变量。其设想是:

①先使pointer _ 1指向a,pointer 2指向b。

②调用swap函数,将pointer _ 1的值传给p1,pointer _2的值传给p2。

③在swap函数中使pl与p2的值交换。

④形参pl与p2将它们的值(是地址)传回实参pointer 1和pointer _ 2,使pointer _ 1指向b,pointer _ 2指向a。然后输出* pointer _ 1和* pointer _ 2,想得到输出“max = 9,min = 5”。

但是,这是办不到的,在输入“5,9”之后程序实际输出为“max = 5,min = 9”。问题出在第4步。

C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。用指针变量作函数参数时同样要遵循这一规则。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。

 

注意:函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一点的。要善于利用指针法。

例题3:

输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。

解题思路:

在函数中改变这3个变量的值。用swap函数交换两个变量的值,用exchange函数改变这3个变量的值。

编写程序:

运行结果: 

程序分析:

exchange函数的作用是对3个数按大小排序,在执行exchange函数过程中,要嵌套调用swap函数,swap函数的作用是对两个数按大小排序,通过调用swap函数(最多调用3次)实现3个数的排序。

http://www.lryc.cn/news/582688.html

相关文章:

  • 实战:Android 15 (API 35) 适配 构建踩坑全记录
  • Java零基础笔记07(Java编程核心:面向对象编程 {类,static关键字})
  • EXCEL(带图)转html
  • linux wsl2 docker 镜像复用快速方法
  • 解决阿里云ubuntu内存溢出导致vps死机无法访问 - 永久性增加ubuntu的swap空间 - 阿里云Linux实例内存溢出(OOM)问题修复方案
  • 代码详细注释:C语言实现控制台用户注册登录系统
  • Spring Boot + Easy Excel 自定义复杂样式导入导出
  • MySQL 8.0 OCP 1Z0-908 题目解析(22)
  • AI编程的未来是智能体原生开发?
  • MyBatis-Plus:深入探索与最佳实践
  • Vue的初步学习
  • 阿里云mysql数据丢失,如何通过服务器备份在其他服务器上恢复数据,并获取mysql丢失数据,完成mysql数据恢复
  • 如何在 Android Framework层面控制高通(Qualcomm)芯片的 CPU 和 GPU。
  • AWS OpenSearch Dev Tools使用
  • 跨平台软件构建方法及工具介绍
  • HCIA-Cloud 是什么?有啥用?
  • Vue 2现代模式打包:双包架构下的性能突围战
  • 在keil中使用stlink下载程序报错Invalid ROM Table
  • 最新团购源码商城 虚拟商城系统源码 全开源
  • 【笔记】开源 AI Agent 项目 V1 版本 [新版] 部署 日志
  • 【Java安全】RMI基础
  • navicat导出数据库的表结构
  • 【1-快速上手】
  • .NET9 实现对象深拷贝和浅拷贝的性能测试
  • ROS平台上使用C++实现A*算法
  • TensorFlow深度学习实战——基于自编码器构建句子向量
  • 微服务集成snail-job分布式定时任务系统实践
  • Go语言反射机制详解
  • 手动实现 Tomcat 核心机制:打造属于自己的 Servlet 容器
  • 【AI智能体】智能音视频-硬件设备基于 WebSocket 实现语音交互