将指针传递给传递给函数的int

时间:2016-08-20 09:55:37

标签: c++

考虑以下代码(基本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}}被删除吗?

3 个答案:

答案 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);