我想了解传递*&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
时,它不再崩溃。
是因为分配新内存会更改指针的值吗?
如果是这样,总是通过*&
而不是*
通过是不是更好又安全?
对此有任何一般规定吗?
答案 0 :(得分:4)
我想了解传递*&p和* p以及何时相互使用之间的区别。
您的目标是更改L
中init
的值,并确保该更改在调用函数中可见。
将指针传递到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
是变量的值