阅读237 返回首页    go 阿里云 go 技术社区[云栖]


引用传实参

希望传实参时,除了传地址,然后那边用指针接收外,还可以直接用“引用”这种机制,十分方便,而且让代码更加简洁清晰

唯一的缺点就是如果只看调用的代码,不知道是不是传实参,不过如果是统一的用法就不会出错了


#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

  上一篇:go DriverStudio 和 WDF驱动 通过GUID获取设备句柄的差别
  下一篇:go js中insertAdjacentHTML的用法