概念

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

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

注意:

  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. HDU4609:3-idiots(FFT)

    Description Input Output Sample Input Sample Output Solution 题意:给你$n$根木棍,问你任选三根能构成三角形的概率是多少. 写挂sb细节心 ...

  2. IPython学习笔记(二)-魔术命令

    .魔术命令:以%为前缀的命令,是ipython的特殊命令,方便完成常见的任务.,常见的魔术命令有:%run,%paste,%cpaste,%timeit,%reset,%hist,%debug,%bo ...

  3. 详解Tensorflow数据读取有三种方式(next_batch)

    转自:https://blog.csdn.net/lujiandong1/article/details/53376802 Tensorflow数据读取有三种方式: Preloaded data: 预 ...

  4. windows服务初识

    参考网址1:http://www.vchome.net/dotnet/dotnetdocs/dotnet38.htm 参考网址2:http://zhidao.baidu.com/link?url=7- ...

  5. linux iSCSI target/initiator配置

    linux iSCSI target配置全过程一:Install iSCSI target for Linux1,操作系统:[root@rac2 ~]# cat /etc/issueEnterpris ...

  6. 基于STM32F103ZET6 HC_SR04超声波测距模块

    这是最后的实验现象,改变不同的角度即可测得距离 板子 PZ6806L 超声波模块 HC_SR04 HC_SR04模块讲解 通过该超声波模块说明书,可明白供电需VCC 5V  还需GND  ECHO(回 ...

  7. C++编写DLL动态链接库的步骤与实现方法

    原文:http://www.jb51.net/article/90111.htm 本文实例讲述了C++编写DLL动态链接库的步骤与实现方法.分享给大家供大家参考,具体如下: 在写C++程序时,时常需要 ...

  8. Noip前的大抱佛脚----一些思路

    目录 一些思路 序列 函数问题 网格图 删除和询问 乘法问题 顺序问题 最值问题 研究成果 数论分块套数论分块的复杂度 一些思路 Tags:Noip前的大抱佛脚 序列 线段树(当然还要有主席树啊!) ...

  9. RTTI(运行时类型识别)

    C++为了能够在运行时正确判断一个对象确切的类型,加入了RTTI和type_info. type_info 为每一个类型增加一个type_info对象. 为了能够在运行时获得对象的类型信息type_i ...

  10. 【转载】malloc内存分配与free内存释放的原理

    原文:http://www.cnblogs.com/huhuuu/p/3456662.html 前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂. 后来室友买了本深入 ...