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

Change a pointer to int passed to function

本文关键字:指针 int 函数      更新时间:2023-10-16

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

其次,要将x的值赋给num,修改void ChangeNum如下所示:
void changeNum(int &n)
{
    int x = 6;
    n = x;
}

并像这样调用函数:

changeNum(num);