考虑以下代码(基本C ++):
#include <cstdio>
void changeNum(int* n) {
int x = 6;
n = &x;
}
int main() {
int num = 5;
changeNum(&num);
printf("num = %d\n", num);
}
为什么num
仍为5? n = &x
不应该让它成为6?
退出函数时会{@ 1}}被删除吗?
答案 0 :(得分:3)
退出函数时是否会删除x?
是。 x
是本地变量。在函数或块内声明的那些变量是局部变量。它们只能由该函数或代码块中的语句使用。
简而言之,这意味着当函数changeNum
结束时,变量x
(在堆栈上分配)将被销毁。
为什么num仍然是5?不应该n =&amp; 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 :(得分:1)
不,它没有像你期望的那样工作。
&
运算符获取变量的地址。所以你要分配地址,而不是价值。因此,您将覆盖指针,这是一个局部变量,恰好具有引用另一个对象的语义含义。
有两种方法可以解决这个问题:
方法1 取消引用n,因此您可以分配给它。
*n = x;
方法2 重写方法以接受引用,因为它使分配更直观。
void changeNum(int &n) {
int x = 6;
n = x;
}
int main() {
int n = 5;
changeNum(n);
}
答案 2 :(得分:0)
首先,变量&#39; x&#39;在void ChangeNum(*n)
内声明,当它超出范围时(执行退出函数时),x被删除。
其次,要将x的值赋给num,请将void ChangeNum
修改为如下所示:
void changeNum(int &n)
{
int x = 6;
n = x;
}
并调用这样的函数:
changeNum(num);