引用&本质


void Input(double*p)
{//输出型参数
	*p = 888.88;
}

int main()
{
	double d1, d2;
	Input(&d1);//C++都是掩盖了事实,写起来舒服
	Input(&d2);

	return 0;
}
void Input(double& d)
{//输出型参数
	d = 888.88;
}
int main()
{
	double d1, d2;
	Input(d1);//C++都是掩盖了事实,写起来舒服
	Input(d2);
	//0x0000000C864FF908
	return 0;
}

存在一个隐藏的指针变量

栈空间:

  • 栈空间用于存储函数调用时的局部变量、函数参数以及返回地址等。每个线程都有独立的栈。

  • 栈空间的大小是有限的,通常由操作系统或者编译器在程序启动时设置。栈空间的大小一般比较小,且无法动态调整。

  • 如果栈空间使用过多(例如递归调用太深,或者局部变量过多),会导致 栈溢出(stack overflow)

#include <iostream>

int main()
{
	int m = 888;
	int& n = m;//等价于int * p = &m;
	//引用也叫做别名变量
	n = -1;//等价于*p = 999;

	return 0;
}

image.png

image.png

image.png

image.png

64位下,后面定义的变量地址空间更大, 分配的呈现方式跟栈空间分配相反。栈空间通常是 从高地址向低地址,

image.png

&lt;think&gt;嗯,用户问的是C++中的引用运算符&amp;是否属于传值调用,以及传址调用的区别。首先我得确认自己对这几个概念的理解是否正确。 记得传值调用是把实参的值复制一份给形参,函数内部修改形参不会影响实参。而传址调用则是传递指针,也就是地址的副本,通过解引用可以修改实参的值。但C++中的引用调用其实和传址不同,引用是别名,操作引用就是直接操作原变量,不需要解引用。 那引用运算符&amp;在函数参数中确实是引用传递,不是传值也不是传址。比如在用户提供的引用[2]中的swap函数,参数是int &amp;x,这里就是引用传递,直接修改x会影响实参的值。而传址调用需要传递指针,比如用int *x作为参数,调用时传地址。 用户可能混淆了传址(指针)和引用传递的区别。需要解释清楚引用传递是直接操作原变量,而传址传递的是指针的值(地址的副本),虽然都能修改原变量,但语法不同。 还要区分引用运算符&amp;在不同上下文的作用。比如在变量声明中的int &amp;x是引用,而取地址运算符&amp;a是获取地址。用户可能把这两个用法搞混了。 另外,根据引用[3],传值会复制实参给形参,而传指针是传地址的副本。引用传递则没有复制,是别名。所以引用运算符用于参数时属于引用传递,既不是传值也不是传址,而是第三种方式。 总结来说,引用传递(使用&amp;)不是传值调用,也不是传址调用,而是一种更高效的方式,避免了拷贝,同时可以直接修改原变量。需要对比三种传递方式的区别,用例子说明,比如swap函数的不同实现。&lt;/think&gt;关于C++引用运算符$&amp;$与参数传递方式的关系,需要从以下三个层面分析: ### 一、引用运算符$&amp;$的参数传递类型 引用运算符$&amp;$**不属于传值调用**,而是实现**引用传递**。这与传址调用(使用指针)有本质区别: 1. **引用传递**:参数声明为$int\ \&amp;x$,直接操作原变量 2. **传址调用**:参数声明为$int\ *x$,需要解引用操作 3. **传值调用**:参数声明为$int\ x$,创建变量副本 ### 二、三种传递方式对比 | 特性 | 传值调用 | 传址调用 | 引用传递 | |-------------------|---------------|----------------|----------------| | 内存操作 | 复制新内存 | 传递指针副本 | 直接操作原内存 | | 语法形式 | $int\ x$ | $int\ *x$ | $int\ \&amp;x$ | | 修改原变量 | 不能 | 需要解引用 | 直接修改 | | 示例代码 | `swap(int x)` | `swap(int *x)` | `swap(int &amp;x)` | ### 三、具体实现差异 **传值调用示例**(创建副本): ```cpp void modify(int x) { x = 100; // 不影响原始变量[^3] } ``` **传址调用示例**(需解引用): ```cpp void modify(int *x) { *x = 100; // 通过指针修改原始变量 } ``` **引用传递示例**(直接操作): ```cpp void modify(int &amp;x) { x = 100; // 直接修改原始变量[^2] } ``` ### 四、关键区别总结 1. **引用传递**是编译器的语法糖,本质通过指针实现但隐藏解引用操作 2. **传址调用**需要显式进行地址操作,适合需要指针运算的场景[^1] 3. **传值调用**会产生拷贝开销,不适合大对象传递[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值