引用传实参
希望传实参时,除了传地址,然后那边用指针接收外,还可以直接用“引用”这种机制,十分方便,而且让代码更加简洁清晰
唯一的缺点就是如果只看调用的代码,不知道是不是传实参,不过如果是统一的用法就不会出错了
#include <iostream> //引用地址空间 void exchange(int &a,int &b) { printf("inside before:a=%d,b=%d\n",a,b); printf("inside before address:&a=%X,&b=%X\n",&a,&b); int tmp=a; a=b; b=tmp; printf("inside after:a=%d,b=%d\n",a,b); printf("inside after address:&a=%X,&b=%X\n\n",&a,&b); } int main() { int a=999; int b=5; printf("before:a=%d,b=%d\n",a,b); printf("before address:&a=%X,&b=%X\n\n",&a,&b); exchange(a,b); printf("after:a=%d,b=%d\n",a,b); printf("after address:&a=%X,&b=%X\n",&a,&b); return 0; }
运行结果为:
before:a=999,b=5
before address:&a=12FF44,&b=12FF40
inside before:a=999,b=5
inside before address:&a=12FF44,&b=12FF40
inside after:a=5,b=999
inside after address:&a=12FF44,&b=12FF40
after:a=5,b=999
after address:&a=12FF44,&b=12FF40
还发现了一个有趣的现象就是,当用小写的 %x 表示的时候,输出的就是 12ff44 的小写表示
当用大写的 %X表示的时候,输出的就是 12FF44 的大写表示
转一个百度知道上面不错的讲解:
记住:函数全是值传递。。参数都是 传递原变量的值的一个 拷贝。不过你要弄明白传递的是什么值。 a,普通变量时值传递,嗯,没问题。你不能改变原来变量的值。 b,如果是指针,是地址的一个拷贝,其实也是值传递(地址的值传递)。你不能改变原来变量(地址)的值,但能(其实不是一定能)改变这个地址指向的内容,即所谓的实参被改变了。。。 c,如果是引用,传递的也是一个地址,不过这个地址又解析过了的,所以能直接用,不用再加*去解析(地址值传递,用时已经解析了)。改变值同指针一样,不过不能改变地址就更明显了(引用其实是一个解析了的const 指针) 1,值传递,而且不能修改原来的值。分配了空间。 2,你是指 char* p=0; char* &p2=p;样子么?对的,能这样子,这时你用p2就和用p一样了,表达的意思就是作为参数传递,你能改变参数的值了,就是能改变实参指针的地址了。。。。而且函数有时需要传参数改变地址,参数就可以 char* &p2这样子(也可以char** 不过要解析地址后用)。然后就可以在函数里面修改地址,然后原来那个指针(即指针的值(地址))就被改变了。其实原理和我上面说的一样。不过有多重*
最后更新:2017-04-03 14:53:58