C++关于指针和使用函数将它们启动到堆的行为究竟是什么?

What exactly is C++'s behavior regarding pointers and using functions to initlize them to the heap?

本文关键字:启动 是什么 究竟 于指针 指针 函数 C++      更新时间:2023-10-16

目前在弄清楚为什么这个函数不会通过函数完全初始化主指针时遇到了一些麻烦。这是我正在尝试做的一个例子。

#include <iostream>
void stuff(int * p)
{
p = new int;
}
int main()
{
int * p;
stuff(p);
*p = 1;
std::cout << *p << std::endl;
return 0;
}

基本上,我正在尝试使函数使整数指针访问堆。之后,我用间接运算符和中提琴打印出来,我有一个输出。不起作用的是 p 没有被初始化。我究竟如何使用函数来初始化指向堆的指针?

您的问题是您正在按值传递指针。

因此,该函数stuff()获取指针的副本。

void stuff(int * p)  // This is a copy of the value you passed in
{
p = new int;     // Here you modify the local copy.
}                    // The external value of p is unaffected.

有几种方法可以解决这个问题。但我认为最好的方法是返回函数的结果值(而不是传递它(。

int* stuff()
{
return new int;
}

那么用法是

p = stuff();

但是您可能正在尝试学习如何获取函数来更改对象的值。在这种情况下,您需要传递对对象的引用。

void stuff(int*& p)  // The & means it is a reference to int*
{
p = new int;
}

用法:

stuff(p);  // same as your original code.

在这里,您将对p的引用传递到函数中。引用是现有对象的另一个名称。对函数中的引用所做的任何更改都会镜像到函数外部的对象中。

这似乎是您要做的。stuffp是本地的,因此将在stuff年底被销毁。要从main访问p,您需要将指向它的指针传递到stuff中。因此,stuff应该期待指向指针的指针。

#include <iostream>
void stuff(int ** p)
{
*p = new int;
}
int main()
{
int * p;
stuff(&p);
*p = 1;
std::cout << *p << std::endl;
delete p;
return 0;
}

在你的实现函数中,工作人员将一个单位化的int*放入它的堆栈中,并为一个int分配内存。问题是 p 变量在主函数中没有更新。 有办法解决这个问题,但它不是那么优雅。

#include <iostream> 
void stuff(int** p) {
*p = new int;
}
int main()
{
int * p;
stuff(&p);
*p = 1;
std::cout << *p << std::endl;
return 0;
}

这可以做你想做的事。