c - 参数中的指针,&符号?
问题描述
我将一个指针传递给一个函数,我可以从指针访问结构的成员。
在这个函数中,我需要使用与参数相同的指针调用另一个函数。我使用&符号,但应用程序已停止。
如何从 myfunction() 调用 anotherfunction() ?
bool anotherfunction( const ovrVkGraphicsPipelineParms * parms )
{
myStruct info;
info.layout = parms->program->parmLayout.pipelineLayout; // application error
}
bool myfunction( const ovrVkGraphicsPipelineParms * parms )
{
myStruct info;
info.layout = parms->program->parmLayout.pipelineLayout; // Works
anotherfunction( &parms ); // compile, but application stopped
}
void main()
{
myfunction( &pipelineParms );
}
解决方案
在 C 中,&
变量前面的字符并不意味着“这个东西是指针”。不,当你放在&
一个变量之前,它的意思是“让我成为一个指向这个的指针”。
所以当你打电话
myfunction(&pipelineParms);
你有一个变量pipelineParms
,你创建了一个指向它的指针,它就是你传递给的那个指针myfunction
。
然后, inmyfunction
是parms
一个指针(特别是指向 type 的指针ovrVkGraphicsPipelineParms
。希望pipelineParms
inmain
也是 type ovrVkGraphicsPipelineParms
。)
所以在 中myfunction
,如果你想将指针传递给anotherfunction
,只需传递它:
anotherfunction(parms);
我们可以看到它anotherfunction
也接受一个指向 type 的指针ovrVkGraphicsPipelineParms
,所以这是正确的。
当你试图打电话anotherfunction(&parms)
时,&
说,“给我一个指向这个的指针”。所以你得到了一个指向typeovrVkGraphicsPipelineParms
或的指针ovrVkGraphicsPipelineParms **
。如果这是预期的,那可能很好anotherfunction
,但事实并非如此。
这并不是说 C 有常规变量和指向常规变量的指针。你可以有指向任何东西的指针。您可以拥有指向指针的指针,以及指向指向指针的指针,理论上您也可以拥有 4 级、5 级和 6 级指针,一直到 12 级或更多(尽管实际上超过 3 级的指针极为罕见)。
还有一件事:你说
anotherfunction( &parms ); // compile, but application stopped
但我猜它实际上并没有正确编译。我猜你的编译器给了你一个警告。我的说:
警告:不兼容的指针类型将“const ovrVkGraphicsPipelineParms **”传递给“const ovrVkGraphicsPipelineParms *”类型的参数;消除 &
如果您的编译器在该行没有给您警告,我鼓励您尽可能切换到更好的编译器。(现代编译器也会警告您void main
,这也是错误的,尽管它不会给您带来任何问题。)