考虑以下代码(基本c++):
#include <cstdio>
void changeNum(int* n) {
int x = 6;
n = &x;
}
int main() {
int num = 5;
changeNum(&num);
printf("num = %dn", num);
}
为什么num
仍然是5?n = &x
不应该是6吗?
退出功能时x
会被删除吗?
退出函数时是否删除x ?
是的。x
为局部变量。那些在函数或块中声明的变量是局部变量。它们只能被该函数或代码块内部的语句使用。
简而言之,这意味着当函数changeNum
结束时,变量x
(在堆栈上分配)将被销毁。
为什么num仍然是5?n = &x不应该是6吗?
让我们分析一下你的奇怪的函数:
void changeNum(int* n) {
int x = 6;
n = &x;
}
你在这里做的是创建一个指针 n
,并为它分配局部变量 x
的地址。
各种评论都是错误的,请注意!这不是未定义行为。指针n
在函数调用时创建(因为是按值传递的,注意指针本身也是按值传递的!),在函数结束时销毁。
实际上你的函数什么也不做:创建一个指针,用调用者提供的地址初始化,然后给它分配另一个地址。
changeNum(&num);
只是说:"创建一个临时指针,按值传递给函数changeNum
(注意按值传递指针!)"。因此,它将创建指针的副本并供函数使用。
我如何实现我想要的?
我建议你好好学习,因为你的代码表明你对指针缺乏经验。
无论如何,正确的行为应该是:
void changeNum(int* n) {
*n = 6
}
将6
赋值给n
所指向的整数!
不,它不像你期望的那样工作。
&
运算符接受变量的地址。你分配的是地址,而不是值。因此,你重写了指针,它是一个局部变量,恰好具有引用另一个对象的语义含义。
有两种解决方法:
方法1 取消对n的引用,这样你就可以给它赋值了。
*n = x;
方法2 重写方法以接受引用,因为它使赋值更直观。
void changeNum(int &n) {
int x = 6;
n = x;
}
int main() {
int n = 5;
changeNum(n);
}
首先,变量'x'在void ChangeNum(*n)
内部声明,当它超出作用域时(当执行退出函数时),x被删除。
void ChangeNum
如下所示:
void changeNum(int &n)
{
int x = 6;
n = x;
}
并像这样调用函数:
changeNum(num);