C++ 为什么不是';t在函数中设置此结构

C++ 为什么不是';t在函数中设置此结构,c++,pointers,struct,C++,Pointers,Struct,我试图将结构指针传递给函数,并通过指针初始化结构。你知道为什么这样不行吗 struct Re { int length; int width; }; void test (Re*); int main() { Re* blah = NULL; test(blah); cout << blah->width; return 0; } void test(Re *t) { t = new Re{5, 5}; } str

我试图将结构指针传递给函数,并通过指针初始化结构。你知道为什么这样不行吗

struct Re
{
    int length;
    int width;
};

void test (Re*);

int main()
{
    Re* blah = NULL;
    test(blah);
    cout << blah->width;
    return 0;
}

void test(Re *t) {
    t = new Re{5, 5};
}
struct-Re
{
整数长度;
整数宽度;
};
孔隙试验(Re*);
int main()
{
Re*blah=NULL;
测试(废话);
库特宽度;
返回0;
}
空隙试验(Re*t){
t=新的Re{5,5};
}

我做错了什么?

指针被复制到函数中,因为它是通过值传递的。必须传递指向指针的指针或指向指针的引用,才能对其进行初始化:

void test(Re *&t) {
    t = new Re{5, 5};
}

您没有在函数参数中初始化指针,因为在
test()
函数中:

void test(Re *t) {
    t = new Re{5, 5};
}
您没有传递指针的引用。初始化指针对象需要指针的引用或指向指针的指针

您也可以这样做:

int main()
{
    Re blah;
    test(&blah);
    cout << blah->width;
    return 0;
}

void test(Re *t) {

  t->length = 5;
  t->width = 5;    

};
intmain()
{
重复废话;
测试(等等);
库特宽度;
返回0;
}
空隙试验(Re*t){
t->长度=5;
t->宽度=5;
};

这个答案显然是错误的——您正在延迟一个
NULL
指针。此外,OP希望在函数
test
中对
blah
所做的任何更改在返回后保持不变。您的代码示例没有这样做。@greatwolf我的想法没有错,我仍然可以在我的
void test(Re*t)
函数中初始化指针的对象(正如Boris Vidolov指出的)。我忘记提到的一件事是在
main()
中传递一个指针的引用以进行测试。但是谢谢你指出。最好不要使用代码示例,因为它仍然是错误的(
blah->width
不会编译)。可能的重复工作很好,但是我对与使用int的区别有点困惑。我对C/C++还不熟悉,但有人告诉我stuct是像原始类型一样处理的?那么为什么test(int*t)可以工作,但是你需要对一个结构进行test(Re*&t)?@user2471908你必须向我们展示你的
int*
代码,因为我敢打赌它与上面的代码不一样,如果你这样使用它,只会将
Re
更改为
int
@user2471908:
无效测试(int*t=0;}
这是正确的,因为您通过引用传递int(因为您传递了一个
int*
),但在这种情况下,您不是试图初始化
re
,而是初始化一个
re*
,因此您需要对它的引用(
re**
re*&
)是的,就像
无效测试(int*t){*t=0;
。我不明白为什么这样做有效,但是无效测试(Re*t)不起作用?
void test(Re*t)
只能初始化
Re
的一个实例,就像@FlowerFire的答案一样,但你想初始化
Re*
,而不是
Re
。如果要初始化类型
T
的实例,必须传递
T*
T&