概念

在定义函数时函数括号中的变量名成为形式参数,简称形参或虚拟参数;

在主调函数中调用一个函数时,该函数括号中的参数名称为实际参数,简称实参,实参可以是常量、变量或表达式。

注意:

  1. C语言中实参和形参之间的数据传递是单向的值传递。
  2. 被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放。
  3. 值传递中包括值传递和指针传递(地址值),传递的都是实参的一个拷贝。

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++]值传递和引用传递的更多相关文章

  1. Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义

    一.Java中什么叫做引用类型变量?引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...

  2. java中值传递和引用传递

    最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...

  3. Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  4. java的值传递和引用传递

    昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...

  5. PHP值传递和引用传递的区别

    PHP值传递和引用传递的区别.什么时候传值什么时候传引用 (1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略 (2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 (3)优 ...

  6. JavaScript 函数参数传递到底是值传递还是引用传递

    tips:这篇文章是听了四脚猫的js课程后查的,深入的理解可以参看两篇博客: JavaScript数据类型--值类型和引用类型 JavaScript数据操作--原始值和引用值的操作本质 在传统的观念里 ...

  7. 【转载】C++ 值传递、指针传递、引用传递详解

    原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...

  8. java中方法的参数传递机制(值传递还是引用传递)

    看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参 ...

  9. java 对象传递 是 值传递 还是 引用传递?

    这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...

  10. java参数传递时到底是值传递还是引用传递

    java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...

随机推荐

  1. Spring常用jar包的功能

    jar名称 描述 spring-framework.jar spring框架比较完整的功能,core+aop+ioc+transaction spring-core.jar 基本上的核心工具类,一些u ...

  2. 禁用wps的云文档,恢复到清爽的状态

    wps安装完成后,默认会开启云文档功能,每次打开表格.文档都会显示乱七八糟的一些东西,很麻烦 不得已只好手动为wps“瘦身”: 在wps表格或者文档的快捷方式上右键,选择打开文件所在位置 找到一个最新 ...

  3. 3223. 文艺平衡树【平衡树-splay】

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3  ...

  4. 洛谷 P1073 最优贸易

    题目描述 CC C 国有 n n n 个大城市和 m mm 条道路,每条道路连接这 nnn 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路 ...

  5. luogu P2709 小B的询问

    嘟嘟嘟 莫队板子. 记住:删除是先删除再移动,添加是先移动在添加! #include<cstdio> #include<iostream> #include<cmath& ...

  6. Java 中 Emoji 的正则表达式

    一.emoji 的范围 查阅维基百科中 emoji 的说明 1. 杂项符号及图形 杂项符号及图形一共有768个字符,范围为: U+1F300 - U+1F5FF,在 Java 中正则表达式为: &qu ...

  7. Metapackage包

    Metapackage(功能包集)是把一些相近的功能模块. 软件包放到一起. ROS里常见的Metapacakge有: 2.Metapackage写法 CMakeLists.txt 写法如下: cma ...

  8. P1063 能量项链

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...

  9. 笔记1:MYSQL

    (注:第一次写,如有错误之处,希望指出,不胜感激,谢谢,不喜也勿喷) 一.MYSQL简单描述 1.MYSQL是什么? MYSQL是现在最流行的关系型数据库管理系统之一: MYSQL是开源软件: 关系型 ...

  10. linux学习第十七天(NFS、AUTOFS文件共享配置,DNS配置)

    一.NFS(网络文件系统,实现linux系统上文件共享) 服务器配置 yum install nfs-utils  (安装NFS软件包) iptables -F  (清空防火墙) service ip ...