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

【时时三省】(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.xdnf.cn/news/14905.html

相关文章:

  • Oracle 存储过程、函数与触发器
  • 【牛客刷题】相遇
  • 暑假读书笔记第四天
  • 关于 scrapy框架 详解
  • 二分查找篇——搜索插入位置【LeetCode】三种写法,python2/python3
  • (电机03)分享FOC控制中SVPWM的输出关联硬件
  • 【AI智能体】智能音视频-硬件设备基于 WebSocket 实现语音交互
  • 【计算机组成原理】-CPU章节学习篇—笔记随笔
  • study_WebView介绍
  • JVM 基础 - 类字节码详解
  • Spring Boot 多数据源切换:AbstractRoutingDataSource
  • 精益管理与数字化转型的融合:中小制造企业降本增效的双重引擎
  • HTML+JS+CSS制作一个数独游戏
  • go go go 出发咯 - go web开发入门系列(一) helloworld
  • 【OceanBase诊断调优】—— 执行计划显示分区 PARTITIONS[P0SP9] 如何查询是哪个分区?
  • 8、保存应用数据
  • 基于Docker Compose部署Traccar容器与主机MySQL的完整指南
  • Xilinx Vivado开发环境快速导出hdf文件(bat批处理)
  • 独立开发A/B测试实用教程
  • 从问题出发看Spring的对象创建与管理
  • 人工智能-基础篇-23-智能体Agent到底是什么?怎么理解?(智能体=看+想+做)
  • 【docker】-1 docker简介
  • 10.6 ChatGLM3私有数据微调实战:24小时打造高精度模型,显存直降60%
  • 七牛云Java开发面试题及参考答案(60道面试题汇总)
  • Swift 解 LeetCode 320:一行单词有多少种缩写可能?用回溯找全解
  • 初识cdp协议(一)
  • 【Mac 从 0 到 1 保姆级配置教程 19】- 英语学习篇-我的英语工作流分享(AI 辅助学习)
  • APM与ChibiOS系统
  • Ubunt20.04搭建GitLab服务器,并借助cpolar实现公网访问
  • React-useReducer-useMemo