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

C++ 将指针更改为传递给函数的int,c++,C++,考虑以下代码(基本C++): #包括 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吗 退出该功能时,x是否被删除?否,它的工作方式与您预期的不同 &运算符获取变量的地址。因此,您分配的是地址,而不是值。因此,您正在重写指针,它是一个局部变量,恰好具有引用另一个对象的语义含义 有两种解决方

考虑以下代码(基本C++):

#包括
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吗


退出该功能时,
x
是否被删除?

否,它的工作方式与您预期的不同

&
运算符获取变量的地址。因此,您分配的是地址,而不是值。因此,您正在重写指针,它是一个局部变量,恰好具有引用另一个对象的语义含义

有两种解决方法:

方法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)

退出函数时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
所指的整数

一,。您只更改了指针的一个副本(通过引用传递)。2.如果这样做的话,当函数调用返回时,您基本上会有未定义的行为,因为指针不再有效。
x
在退出函数时被删除,因此在函数外部使用其地址是未定义的行为。了解解引用操作符
*
。很好,找到了它。谢谢大家!
int&n
会更好,但如果不是这样,那就太好了answer@LightnessRacesinOrbit:我不关心格式,工具应该为我做这件事。我只是习惯于把
&
*
放在同一个地方,而
*
正好在prenting
int*a,b的右边再次发布!为什么你认为一个边缘情况很重要?有太多更重要的原因来决定路线,在我看来,它们都指向左路线。右对齐
*
&
对于语言新手来说是非常混乱的,并且会导致如此多的问题!好的代码不会在一行上声明多个变量。您选择右对齐
&
的原因也不是因为您右对齐了
*
;这是因为所有相同的规则都直接适用。@LightnessRacesinOrbit正如我所说,我不在乎它,这种风格只是一种习惯。当你想写东西的时候,使用叮当声或类似的格式。是的,但现在你在教学,所以你写的东西对别人很重要。请注意:)
void changeNum(int* n) {
    *n = 6
}