如何理解数据结构中的引用参数(&)
来源:互联网 发布:apache kylin教程 编辑:程序博客网 时间:2024/05/22 05:09
C语言中的&是取变量逻辑地址的操作, 与变量本身所在的物理地址没有关系,它直接与变量的值相关,即使变量本身所在的物理地址改变,对&操作也没有影响,&操作取值不会改变.
而*是取变量物理地址的操作, 即使变量本身所在的逻辑地址改变,对&操作也没有影响, &操作取值不会改变.但是 一旦物理地址中的数据改变,*操作所得的数据也将随之改变.
这就像是在一栋楼房中找人,&是按入住人的名字找人,而*是按门牌号找人, 虽然同是找人,但还是有本质上的区别的.当且仅当门牌号对应的人与按入住人姓名找的人相同的时候, 找到的人才是同一个人.
&的用法和含义,见下面的例子:
main()
{ int i=3,j=5;
change(i,j);
printf("i1=%d ,%d ",i,j);
}
void change(int n, int m)
{ n=n+m;
printf("n=%d,m= %d ",n,m);
}
运行的结果为:
i1=3,5
n=8, m=5
现把上面的程序改为:
main()
{ int i=3,j=5;
change(&i,j);
printf("i1=%d ,%d ",i,j);
}
void change(int &n, int m)
{ n=n+m;
printf("n=%d,m= %d ",n,m);
}
运行的结果为:
i1=8,5
n=8, m=5
为什么会产生这样的结果?
C语言中的&是取变量地址的操作,在执行main(){ int i=3,j=5; 时, 操作系统(os)会对变量i,j分配内存单元,如i的地址是2800,os只管理2800的单元,它并不知变量i,执行i=3;则2800单元中的内容是3,用符号(2800)=3表示,执行调change函数,把i的地址2800传递给n,&n=2800,在执行n+m,则2800单元中的内容变成8,(2800)=8,再退回到main时,执行 printf("i1=%d ,%d ",i,j);则应该把2800单元中的内容输出(注意在os中没有变量的处理,只有对地址的管理),这时2800单元中的内容已变成8,所以输出是i1=8,5。我们注意到此时i和n实际上是共用的同一个地址,所以n的改变会影响上一级的模块中的i变量,即参数的双向传递!
实际中由于c语言并不是一种非常严谨的语言,它本身并不提供参数的双向传递功能,是用地址来实现的。在数据结构的课程中,以后只要发现参数中有&符号,它就是双向传递,即既有输入又有输出,可以把它理解成全局量,但全局量在整个系统的所有模块都起作用,&只在定义的函数(模块)中起作用,可以理解为“局部的全局量”。
&符号我想不出有很好和严谨的描述方法,如果一定要与某些东西类比,在pascal中的VAR是最接近的, 如Proc change(VAR n:integer, m:integer)
关于函数参数的传递方式:
值传递:只是将参数值copy函数中,因此在函数中无法修改该参数的值。修改的只是传入参数的一份copy.
引用传递:将参数地址传给函数,因此在函数中能修改该参数的值
- #define Fun_No_Error 1
- #include <stdio.h>
- /*
- 该程序用来验证,函数中参数的值传递,与引用传递的不同点
- */
- //Value deliver
- void FucValue(int a,int b)
- {
- printf("\nAddress of a is %d",&a);
- printf("\nAddress of b is %d",&b);
- a=a+1;
- b=b+1;
- }
- //refer deliver
- void FucRefer(int &a,int &b)
- {
- printf("\nAddress of a is %d",&a);
- printf("\nAddress of b is %d",&b);
- a=a+1;
- b=b+1;
- }
- int main(int argc,int argv[])
- {
- int input1,input2,input3,input4;
- printf("Please input two integer:");
- scanf("%d",&input1);
- scanf("%d",&input2);
- printf("\nAddress of input1 is %d",&input1);
- printf("\nAddress of input2 is %d",&input2);
- FucValue(input1,input2);
- printf("\ninput1=%d\ninput2=%d",input1,input2);
- printf("\nPlease input two integer:");
- scanf("%d",&input3);
- scanf("%d",&input4);
- printf("\nAddress of input1 is %d",&input3);
- printf("\nAddress of input2 is %d",&input4);
- FucRefer(input3,input4);
- printf("\ninput1=%d\ninput2=%d",input3,input4);
- }
本文出自 “sirius” 博客,请务必保留此出处http://89wyz.blog.51cto.com/950360/346882
- 如何理解数据结构中的引用参数(&)
- 如何理解数据结构中的引用参数 &
- 如何理解c++中的引用折叠?
- 如何理解CUDA中的cudaMalloc()的参数
- 如何理解 CUDA 中的 cudaMalloc() 的参数
- 如何理解CUDA中的cudaMalloc()的参数
- C++中的指针与引用、如何参数传递
- 理解 boost::shared_ptr 中的引用计数是如何工作的
- <C++>5.如何全方位理解C++中的“引用”?
- 关于参数中的引用
- 函数参数中的引用
- 对引用参数&的理解
- 如何理解Move参数中的const Source和var Dest
- 如何理解函数形参为指针和引用类型的参数传递
- 理解Java中的弱引用
- 理解Java中的弱引用
- 理解Java中的弱引用
- 理解Java中的弱引用
- 非printf形式打印各种数据类型的十六进制和二进制
- 以Webkit为核心的浏览器的CSS样式-----Mask
- 线程创建后,未必立即运行
- DM8168 EMAC/MDIO模块(5)
- 浅析Android下的Android.mk文件
- 如何理解数据结构中的引用参数(&)
- php中的json
- Activity栈(收藏)
- 趣题2:火柴游戏
- 每个程序员都应读的书
- 人生大器
- php操作excel
- PHP 中 getopt 函数的用法
- 什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?