标签搜索

软工知识点

wehg489
2026-01-07 / 0 评论 / 1 阅读 / 正在检测是否收录...

函数调用时实参向形式参数传递相应类型的值,则称为是传值调用。这种方式下形式参数不能向实参传递信息。实参可以是变量,也可以是常量和表达式。引用调用的实质是将实参变量的地址传递给形参,因此,形参是指针类型,而实参必须具有左值。变量具有左值,常量没有左值。被调用函数对形参的访问和修改实际上就是针对相应实际参数所作的访问和改变,从而实现形参和实参间双向传递数据的效果。


mk3p3cok.png
为什么只有变量才有存储位置

问题简单来说就是内存寻址的概念。计算机中,程序运行时,数据需要存储在内存中特定的位置(地址)。变量在程序中定义时,编译器或解释器会为它分配一块内存空间,因此变量有存储位置(地址)。而常量和表达式的结果(除非被赋给变量)通常是临时性的,它们可能存放在寄存器或临时栈空间,但程序通常不提供直接访问其地址的机制(尤其是常量,往往在编译时就确定了值,可能直接嵌入指令中,没有运行时内存地址)。对于引用调用(传递地址),需要实参有一个固定的、可寻址的内存位置,以便形参(指针)能够指向它,从而通过指针修改其内容。常量没有可修改的内存位置(常量通常存储在只读内存区或直接编码在指令中),表达式的结果是临时值,也没有持久的内存地址(除非先赋给变量)。因此,只有变量(或更广义的左值)才能进行引用传递。

左值(lvalue)是一个历史术语,意指可以出现在赋值语句左边的表达式,即它标识了一个可存储对象的位置。变量是典型的左值。常量和算术表达式的结果是右值(rvalue),它们没有可标识的存储位置(或者说是临时值)。引用调用需要左值,因为需要取地址。

举例:假设有函数 void f(int &x) { x = 10; }
调用时:int a = 5; f(a); // 正确,a是变量,有地址
f(5); // 错误,5是常量,没有可修改的地址
f(a+1); // 错误,a+1是表达式结果,临时值,没有持久地址

因此,引用调用要求实参必须是左值(变量)。

0

评论 (0)

取消
歌曲封面
0:00