[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里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
随机推荐
- 基于反射启动Spring容器
基于反射启动Spring容器 package com.maple.test; import org.springframework.context.ApplicationContext; import ...
- 3、JVM--垃圾回收期和内存分配策略(2)
3.5.垃圾收集器 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集 ...
- Node.js框架之Egg.js
Node.js是我前段时间接触的一个JavaScript的服务端语言,感觉还是挺有意思的. 也许有人说,你学这么多,学的过来吗?或者说学的太多,专而不精,有必要这样吗? 其实,我个人认为,自从我进入I ...
- java 输出流 outputstream
一:输入和输出概念 输入流(inputstream):对于java程序来说,从程序写入文件叫做输出. 输出流(outputstream):对于java程序来说,从文件读取数据,到java程序叫做输入. ...
- 在用AJAX跨域请求时遇到的问题
刚刚接触ajax就遇到一个词--跨域. 在我百度了各种资料以后总结了一句话:“只要不是在一个协议.域.名端口下,都属于跨域(127.0.0.1本地也属于跨域)”. 在做ajax请求的时候,请求不到并且 ...
- git merge的使用
在实际开发中经常会用到git merge操作.但很多情况下我们并不想合并后直接提交,这里介绍git merge的两个常用参数: --no-commit --no-commit 参数使得合并后,为了防止 ...
- 生死系列--WuJie
WuJie,高中和中专时期的同学,篮球队的队友. 在高三时认识的,我们隔壁班的,但仅限于认识,并未打过交道.高中毕业后考在同一所学校,同一个班,象棋下的很好,喜欢打扑克牌,在班上任团支部书记. 球队时 ...
- 2017-2018-2 《网络对抗技术》 20155322 Exp4 恶意代码分析
[-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实践过程 2.1-Mac下网络监控 2.2-Windows下网络监控 2.3-Mac下恶意软件分析 2 ...
- django-groundwork
我的环境是windows7 + python34 + django1.8 下面两篇文章提到了django的scaffold,感觉是一个挺不错的功能: Django实战(3):Django也可以有sca ...
- 微信小程序:选项卡页面切换
一.功能描述 在同一个页面内实现不同展示页面的切换功能,如下图所示 二.代码实现 1. index.js Page({ /** * 页面的初始数据 */ data: { currentData : 0 ...