C++ 通过值传递指针-在函数中分配内存

C++ 通过值传递指针-在函数中分配内存,c++,C++,当我想为函数中的指针分配内存时,我必须通过引用(或指针)传递指针,例如: void fun(int*& ptr) //or int** ptr { ptr = new int(1); } int* ptr = nullptr; fun(ptr); int x = *ptr; 我注意到,当我有一个包含按值传递的指针的结构时: struct T { int* ptr{ nullptr }; }; void fun(T* t) { t->ptr = new

当我想为函数中的指针分配内存时,我必须通过引用(或指针)传递指针,例如:

void fun(int*& ptr) //or int** ptr
{
    ptr = new int(1); 
}

int* ptr = nullptr;
fun(ptr);
int x = *ptr;
我注意到,当我有一个包含按值传递的指针的结构时:

struct T
{
    int* ptr{ nullptr };
};

void fun(T* t)
{
    t->ptr = new int(1);
}

T *t = new T{};
fun(t);
int x = *(t->ptr);

您能解释一下为什么在第二种情况下,我不必通过引用或指针传递指向结构的指针吗?

您试图返回给调用方的类型是
int*
。使用typedef应有助于:

using IntPtr = int*;

void fun(IntPtr& ptr) // works
{
    ptr = new int;
}
void fun(IntPtr* ptr) // works
{
    *ptr = new int;
}
void fun(IntPtr ptr) // won't work
{
    ptr = new int;
}

struct Foo
{
    IntPtr ptr;
};

void fun(Foo& foo) // works
{
    foo.ptr = new int;
}
void fun(Foo* foo) // works
{
    foo->ptr = new int;
}
void fun(Foo foo) // won't work
{
    foo.ptr = new int;
}

您试图返回给调用方的类型是
int*
。使用typedef应有助于:

using IntPtr = int*;

void fun(IntPtr& ptr) // works
{
    ptr = new int;
}
void fun(IntPtr* ptr) // works
{
    *ptr = new int;
}
void fun(IntPtr ptr) // won't work
{
    ptr = new int;
}

struct Foo
{
    IntPtr ptr;
};

void fun(Foo& foo) // works
{
    foo.ptr = new int;
}
void fun(Foo* foo) // works
{
    foo->ptr = new int;
}
void fun(Foo foo) // won't work
{
    foo.ptr = new int;
}

是什么让你认为
void-fun(T*T)
是通过值传递T的?您正在传递一个指向T的指针。将代码更改为
void fun(T)
,您会发现它再次不起作用。这里的基本问题是,如果要更改函数中的某个内容,必须传递指向该内容的引用或指针。您可以将某物包装在一个结构中,然后向该结构传递一个指针(就像您正在做的那样),这将起作用。请注意(这才是真正让人困惑的)它和什么东西没有任何区别,它可以是指针,也可以是整数,都一样。但出于某种原因,人们认为当某物本身是指针时,规则是不同的,事实并非如此。“是什么让你认为void fun(T*T)是通过值传递T?”这里的指针是通过值传递的。是的,但你有两个指针,你试图更改的指针不是通过值传递的。您实际上是在向您试图更改的指针传递一个指针,这是有效的。是什么让您认为
void-fun(T*T)
是按值传递T?您正在传递一个指向T的指针。将代码更改为
void fun(T)
,您会发现它再次不起作用。这里的基本问题是,如果要更改函数中的某个内容,必须传递指向该内容的引用或指针。您可以将某物包装在一个结构中,然后向该结构传递一个指针(就像您正在做的那样),这将起作用。请注意(这才是真正让人困惑的)它和什么东西没有任何区别,它可以是指针,也可以是整数,都一样。但出于某种原因,人们认为当某物本身是指针时,规则是不同的,事实并非如此。“是什么让你认为void fun(T*T)是通过值传递T?”这里的指针是通过值传递的。是的,但你有两个指针,你试图更改的指针不是通过值传递的。实际上,您正在将一个指针传递给您试图更改的指针,这是有效的。