[C++]值传递和引用传递
概念
在定义函数时函数括号中的变量名成为形式参数,简称形参或虚拟参数;
在主调函数中调用一个函数时,该函数括号中的参数名称为实际参数,简称实参,实参可以是常量、变量或表达式。
注意:
- C语言中实参和形参之间的数据传递是单向的值传递。
- 被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放。
- 值传递中包括值传递和指针传递(地址值),传递的都是实参的一个拷贝。
void exchange(int x, int y)
{
printf("x:%d,y:%d\n", x, y);
printf("&x:%x,&y:%x\n", &x, &y);
printf("------------\n");
int temp = x;
x = y;
y = temp;
printf("x:%d,y:%d\n", x, y);
printf("&x:%x,&y:%x\n", &x, &y);
}
void exchange1(int* x, int *y)
{
printf("*px:%d,*py:%d\n", *x, *y);
printf("px:%x,py:%x\n", x, y);
printf("&px:%x,&py:%x\n", &x, &y);
printf("------------\n");
int temp = *x;
*x = *y;
*y = temp;
printf("*x:%d,*y:%d\n", *x, *y);
printf("x:%x,y:%x\n", x, y);
printf("&x:%x,&y:%x\n", &x, &y);
}
void exchange2(int &x, int &y)
{
printf("x:%d,y:%d\n", x, y);
printf("&x:%x,&y:%x\n", &x, &y);
printf("------------\n");
int temp = x;
x = y;
y = temp;
printf("x:%d,y:%d\n", x, y);
printf("&x:%x,&y:%x\n", &x, &y);
}
int main()
{
int x, y;
x = 3;
y = 5;
printf("x:%d,y:%d\n", x, y);
printf("&x:%x,&y:%x\n", &x, &y);
printf("------------\n");
printf("值传递\n");
exchange(x, y);
printf("实参\n");
printf("x:%d,y:%d\n", x, y);
printf("&x:%x,&y:%x\n", &x, &y);
printf("指针传递\n");
int *px, *py;
px = &x;
py = &y;
exchange1(px,py);
printf("实参\n");
printf("*x:%d,*y:%d\n", *px, *py);
printf("x:%x,y:%x\n", px, py);
printf("&x:%x,&y:%x\n", &px, &px);
printf("引用传递\n");
exchange2(x, y);
printf("实参\n");
printf("x:%d,y:%d\n", x, y);
printf("&x:%x,&y:%x\n", &x, &y);
cin.get();
}
值传递
传递的参数是实参的副本主调函数向调用函数传递参数实际上只是将实参的拷贝(即临时副本)传递给了被调用函数,并不是实参本身,这样被调函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。
x:3,y:5
&x:cff89c,&y:cff890
------------
值传递
x:3,y:5
&x:cff7a0,&y:cff7a4
------------
x:5,y:3
&x:cff7a0,&y:cff7a4
实参
x:3,y:5
&x:cff89c,&y:cff890
x:3,y:5
&x:cff89c,&y:cff890
------------
指针传递
*px:3,*py:5
px:cff89c,py:cff890
&px:cff7a0,&py:cff7a4
------------
*x:5,*y:3
x:cff89c,y:cff890
&x:cff7a0,&y:cff7a4
实参
*x:5,*y:3
x:cff89c,y:cff890
&x:cff884,&y:cff884
引用传递
对引用的操作等于对其指定的对象进行操作,当将实参传递给形参时,形参就指向了实参(形参与实参同义,是它的一个别名)
引用传递过程中,被调函数的形式参数虽然同样作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
引用传递
x:5,y:3
&x:cff89c,&y:cff890
------------
x:3,y:5
&x:cff89c,&y:cff890
实参
x:3,y:5
&x:cff89c,&y:cff890
[C++]值传递和引用传递的更多相关文章
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- java中值传递和引用传递
最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java的值传递和引用传递
昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...
- PHP值传递和引用传递的区别
PHP值传递和引用传递的区别.什么时候传值什么时候传引用 (1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略 (2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 (3)优 ...
- JavaScript 函数参数传递到底是值传递还是引用传递
tips:这篇文章是听了四脚猫的js课程后查的,深入的理解可以参看两篇博客: JavaScript数据类型--值类型和引用类型 JavaScript数据操作--原始值和引用值的操作本质 在传统的观念里 ...
- 【转载】C++ 值传递、指针传递、引用传递详解
原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...
- java中方法的参数传递机制(值传递还是引用传递)
看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
- java 对象传递 是 值传递 还是 引用传递?
这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
随机推荐
- Hadoop学习之路(二)Hadoop发展背景
Hadoop产生的背景 1. HADOOP最早起源于Nutch.Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取.索引.查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题—— ...
- Spring AOP源码分析(三)创建AOP代理
摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 目录 一.获取增强器 1. 普通增强器的获取 2. 增加同步实例化增强 ...
- HDU 2602 Bone Collector(经典01背包问题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/O ...
- 网络编程中的read,write函数
关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illustrated,vol1>(TCP/IP详解卷1). 关于第二层面,依然建议Richard Steve ...
- 名字&值
1)名字VS值 名字和内存(存储)位置相关联. 名字—(环境)———>位置——(状态)——>值 这两个映射都在随着程序的运行而改变. 2)环境VS状态 环境是指一个名字到存储位置映射,也可 ...
- MySQL学习【第二篇安装】
一.Mysql安装方式 1.安装方式 1.rpm,yum安装 安装方便,安装速度快,但无法定制 2.二进制安装 不需要安装,解压即用,不能定制功能 3.编译安装 可定制,安装很慢,安装分为四个步骤 1 ...
- 在 Mac 上通过 Docker 运行 Asp.net Core 简易教程
首先,你需要在 Mac 上安装好 Docker 下载地址 https://download.docker.com/mac/stable/Docker.dmg 或者查看别人的 安装教程 怎么安装这里就不 ...
- Oracle数据库无法向listener注册的解决一例
当机器的IP地址改变了,或者机器名改变后, 动态注册可能会失败. 运行 lsnrctl status时,无论等待多久,都会发生:no services 这样的信息. 此时,最好的解决方法,就是删除原有 ...
- C++实现tar包解析
tar(tape archive)是Unix和类Unix系统上文件打包工具,可以将多个文件合并为一个文件,使用tar工具打出来的包称为tar包.一般打包后的文件名后缀为".tar" ...
- 【BZOJ1048】 [HAOI2007]分割矩阵
[BZOJ1048][HAOI2007]分割矩阵 题面 bzoj 洛谷 题解 \(dp[a][b][c][d][num]\)表示将矩形\((a,b,c,d)\)分成\(num\)个的最小方差,然后转移 ...