就是什么时候用&L,什么时候用L,请大家指点指点,谢谢!
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)