引用传实参

简介:

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

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


#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** 不过要解析地址后用)。然后就可以在函数里面修改地址,然后原来那个指针(即指针的值(地址))就被改变了。其实原理和我上面说的一样。不过有多重*

相关文章
|
6月前
|
存储 安全 编译器
C++函数重载及引用
C++函数重载及引用
39 0
|
2月前
函数的形参
函数的形参
11 0
|
11月前
我应该使用按值调用还是按引用调用?
我应该使用按值调用还是按引用调用?
|
8月前
|
C++
c++引用作为函数参数和函数返回值
c++引用作为函数参数和函数返回值
41 0
|
9月前
|
存储 自然语言处理 安全
C++——函数重载,引用
✅<1>主页:我的代码爱吃辣 📃<2>知识讲解:C++ 🔥<3>创作者:我的代码爱吃辣 ☂️<4>开发环境:Visual Studio 2022 💬<5>前言:补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。
|
安全 编译器 C语言
C++程序设计——函数重载、引用
C++程序设计——函数重载、引用
134 0
C++程序设计——函数重载、引用
|
存储 Unix PHP
变量的引用赋值与传值赋值
一、使用 memory_get_usage() 查看PHP内存使用量 1. 传值赋值
 变量的引用赋值与传值赋值
|
C++
C/C++形参和实参的区别?
C/C++形参和实参的区别?
239 0
C/C++形参和实参的区别?
|
设计模式 C#
C# 未提供必须形参对应的实参
父类有了带参数的构造函数,子类的构造函数可以不和父类的构造函数一样,但是,如果你的父类定义了带参数的构造函数同时没有无参重载的情况下,那么在子类中,你必须对父类的带参数的构造进行赋值,也就是实参!
443 0
C# 未提供必须形参对应的实参
|
存储 C语言
指针妙用之将函数中形参的值传递给实参
指针妙用之将函数中形参的值传递给实参