什么时候传递T *&p而不是T * p?

时间:2018-06-27 03:58:33

标签: c++ pointers reference

我想了解传递*&p*p与何时相互使用之间的区别。

说,我有一个如下的初始化函数。

void init(lua_State *L) {
    L = luaL_newstate(); //allocate new memory to L
}

main()中,如果我尝试访问L,它将崩溃。

lua_State *L;
init(L);
do_something(L);//crash

但是,当我将参数类型更改为lua_State *&L时,它不再崩溃。

是因为分配新内存会更改指针的值吗?

如果是这样,总是通过*&而不是*通过是不是更好又安全?

对此有任何一般规定吗?

2 个答案:

答案 0 :(得分:4)

  

我想了解传递*&p和* p以及何时相互使用之间的区别。

您的目标是更改Linit的值,并确保该更改在调用函数中可见。

将指针传递到init无效,因为对参数的任何更改都只是局部更改。它不会更改调用函数中变量的值。因此,指针在main中保持未初始化。在main中使用未初始化的指针会导致未定义的行为,这表现为系统崩溃。

我建议将init的参数类型更改为对指针的引用。当您这样做时,对参数的任何更改都将在调用函数中可见。

void init(lua_State*& L) {
    L = luaL_newstate(); //allocate new memory to L
    // The new value of L will be visible in the calling function.
}

并将其用作

lua_State *L;
init(L);
do_something(L);

建议进行更好的编码实践-始终在声明时初始化自动变量。

lua_State* L = nullptr;
init(L);
do_something(L);

答案 1 :(得分:-1)

考虑一个变量int p,然后&p表示p的地址,最后*&p = p,即p的值

现在考虑变量int *p,然后p指向p的地址,而*p是变量的值