作者 | 李肖遥       责编 | 欧阳姝黎

函数参数传递主要有2种传递方式,值传递和引用传递,这个过程是实际参数将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的一个过程。

本文略过参数不是指针的情况,这种情况实际上是复制了一个外部变量的副本进入函数中,函数体内操作的为该副本,不会实际修改函数外的该变量。

为什么?被调函数的形参只有函数被调用的时候才会临时分配单元,一旦调用结束占用的内存便会释放,所以调用的函数中存储该参数的地址跟被调函数中参数的地址不同。往往我们对C与C++关于*与&的使用不是很清楚,C语言没有引用只有指针,引用是在C++里面才存在的操作。

参数为指针的情况(使用*)

这种情况实际上是在函数内部复制了一个指针的副本,如果单纯的修改指针,在跳出函数后,该指针指向不受影响;但如果修改的是指针指向的值,那么外部指针所指向的内容也相应修改了,因为两个指针都是指向同一个内存空间的。

用*运算取地址的内容,C++代码(C语言也一样的)如下:

#include <iostream>
using namespace std;void function(int* num){*num = 100;
}int main()
{int number;number = 1;function(&number);cout << number << endl;return 0;
}
//输出100

形参num是一个指针,传递过来的是一个地址值,通过改变num对应地址的值来实现值的改变,解引用即可访问到这个地址值映射的值。

引用方式传值(使用&)

#include <iostream>
using namespace std;void function(int& num){//通过引用改变num的值num = 100;
}int main()
{int number;number = 1;function(number);cout << number << endl;system("pause");return 0;
}
//输出100

对引用的操作等于是对其指定的对象进行操作,当将实参传递给形参时,形参就指向了实参。

例子

#include <iostream>
using namespace std;//测试如果引用进入函数后进行修改,跳出函数后变量是否修改;
void ChangeRef(int& ref) {ref++;cout << "引用内修改后的值为:" << ref << endl;
}//测试以传值方式进入函数进行修改,跳出函数后变量是否修改
void ChangeNotRef(int ref) {ref++;cout << "通过传值方式在函数内修改后的值为:" << ref << endl;
}//测试以指针为参数传入函数,修改指针指向,是否影响外部指针指向
void ChangePtr(int* ptr) {ptr++;cout << "函数内修改后的指针指向:" << ptr << endl;
}//测试在函数中修改指针指向的内容,是否影响外部指针指向内容
void ChangePtrVal(int* ptr) {(*ptr)++;cout << "函数内修改后指针指向的值:" << *ptr << endl;
}int main() {int Ref = 0;cout << "传入引用之前的值为:" << Ref << endl;ChangeRef(Ref);cout << "在函数内修改引用后,跳出函数的值为:" << Ref << endl << endl;ChangeNotRef(Ref);cout << "通过传值方式在函数内修改后,跳出函数的值为:" << Ref << endl << endl;int* ptr = &Ref;cout << "传入函数前的指针指向:" << ptr << endl;ChangePtr(ptr);cout << "传值方式传入函数跳出后的指针指向:" << ptr << endl << endl;cout << "传入前指针指向的值为:" << *ptr << endl;ChangePtrVal(ptr);cout << "从函数中出来后指针指向的值为:" << *ptr << endl << endl;system("pause");return 0;
}//参考网上例子

运行结果如下:

小结

值传递和引用传递,传递的都是实参的一个拷贝。

C语言中实参和形参之间的数据传递是单向。

被调用函数的形参只有函数被调用时才会临时分配存储单元,结束便会被释放。

☞不同芯片的 Mac 电脑,差距会逐渐拉大吗?☞乐视 logo 换新:显示“老板造车美利坚”;雷军给米粉起名小粽子;谷歌浏览器不再隐藏完整 URL|极客头条
☞“搏一搏,单车变摩托!”华为天才少年耗时四个月,将自行车强势升级为自动驾驶

C与C++关于*与的传参解析相关推荐

  1. php将get传参解析成数组,php解析url (parse_url) 参数成数组 (parse_str)

    今天首先让我们为天津8.12大爆炸和陕西山阳山体滑坡遇难的同胞默哀3分钟,祝愿受伤的群众早日康复,脱离危险,希望国家严惩事故责任人,安抚受损群众.希望杯具以后不再发生--最近天灾人祸,大家出行一定要注 ...

  2. URL地址 问号传参解析

    一.什么是URL参数? URL 参数是追加到 URL 上的一个名称/值对.参数以问号 (?) 开始并采用 name=value 的格式.如果存在多个 URL 参数,则参数之间用一个 (&) 符 ...

  3. Spring Controller get、post传参解析

    文章目录 前言 一.RequestParam 二.RequestBody 结尾 前言 在不同的参数上使用不同的注解,在进行http请求的时候,发现Get和Post有时有的竟然无法请求,所以简单总结一下 ...

  4. MySQL_PHP学习笔记_2015_0614_PHP传参总结_URL传参_表单传参

    1. PHP 传参总结   1.1 url 传参 解析方法(下面两种解读方式均可以): $firstName1 = $_GET['firstName']; $firstName2 = $_REQUES ...

  5. .NET Core3.0+ WebApi dynamic传参中带有ValueKind属性处理方法

    背景:在.NET Core3.0+框架下编写WebApi并且使用dynamic类型传参,后台接收到的参数中会包含一个ValueKind的属性,包含ValueKind属性会影响取参的便捷性 导致原因:. ...

  6. 文件上传漏洞 — 解析、验证、伪造

    绕过黑名单 前端验证绕过 看看前段白名单允许上传什么后缀名的文件 写个一句话木马,后缀名改成白名单里的后缀名 <?php eval($_REQUEST['a'])?> 上传时抓包修改后缀名 ...

  7. Go 学习笔记(25)— 并发(04)[有缓冲/无缓冲通道、WaitGroup 协程同步、select 多路监听通道、close 关闭通道、channel 传参或作为结构体成员]

    1. 无缓冲的通道 无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道. 这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能 ...

  8. MySQL 存储过程传参之in, out, inout 参数用法

    存储过程传参:存储过程的括号里,可以声明参数. 语法是 create procedure p([in/out/inout] 参数名  参数类型 ..) in :给参数传入值,定义的参数就得到了值 ou ...

  9. shell脚本的命令行传参

    在Linux环境下开发C程序,若想要可选择性的给程序传递外部参数,最后是以启动脚本的形式间接进行传递,这样对于命令行的参数解析工作将集中到shell脚本中,大大增加C代码的可移植性.       sh ...

最新文章

  1. VC++实现QPSK调制
  2. SwaggerUI看烦了,IGeekFan.AspNetCore.Knife4jUI 帮你换个新皮肤
  3. 51 SD配置-定价配置-维护定价过程
  4. paper 6:支持向量机系列三:Kernel —— 介绍核方法,并由此将支持向量机推广到非线性的情况。...
  5. jQuery easyUI Pagination控件自定义div分页(不用datagrid)
  6. 群签名和环签名的区别_苹果企业签名和苹果超级签名的区别
  7. Nginx设置expires设定页面缓存时间
  8. 6月16日!蒋江伟深度解读基础云产品生态战略 | 凌云时刻
  9. Ubuntu18.04-albert编译安装记录
  10. MAE平均绝对误差和MSE均方误差
  11. 小码哥C++_反汇编分析
  12. Linux---虚拟机安装Linux系统与联网实现
  13. GWAS数据分析专题
  14. 桥牌坐庄训练bm2000 level3闯关记录——A8
  15. bzoj3663/4660CrazyRabbit bzoj4206最大团
  16. 10个小技巧,让你使用ZBrush建模操作效率翻倍
  17. 高级程序员最爱用的8款代码编辑器,你用哪几个?
  18. 基于微信的智能家居控制系统的设计与实现
  19. 1394接口测试工装研究
  20. 天际友盟_真正增加游戏性的最佳天际模组

热门文章

  1. ActiveMQ 消息游标(Message Cursors)
  2. Struts2学习笔记(六) 结果(Result)(上)
  3. 学习IOS开发UI篇--UIView\UIButton\UILabel\UIImageView\UITextField
  4. import cv2 失败 ImportError:DLL load fail:找不到指定模块
  5. [Windows] 程序生成出现语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符”...
  6. Visual.Basic.2008编程参考手册
  7. IDEA将maven项目配置到本地tomcat中运行
  8. 济南学习 Day 5 T2 am
  9. 64位/32位操作系统ODBC的设定方法
  10. strong和weak 细节