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

Ken*_*and -3 c++ heap stack pointers

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

#include <iostream>

void stuff(int * p)
{
    p = new int;
}

int main()
{
    int * p;
    stuff(p);
    *p = 1;
    std::cout << *p << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

基本上我试图让它成为一个函数使整数指针访问堆.在那之后,我用间接运算符和中提琴打印出来,我有一个输出.什么不起作用是p不是初始化.我究竟如何使用函数初始化指向堆的指针?

Mar*_*ork 6

您的问题是您按值传递指针.

因此该函数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.
Run Code Online (Sandbox Code Playgroud)

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

int* stuff()
{
    return new int;
}
Run Code Online (Sandbox Code Playgroud)

然后使用是

    p = stuff();
Run Code Online (Sandbox Code Playgroud)

但是你可能正在尝试学习如何获得一个函数来改变一个对象的值.在这种情况下,您需要传递对象的引用.

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

用法:

    stuff(p);  // same as your original code.
Run Code Online (Sandbox Code Playgroud)

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