GUN*_*NNM 1 c pointers parameter-passing ampersand
我将指针传递给函数,可以从指针访问struct的成员。
在此函数中,我需要使用与参数相同的指针来调用另一个函数。我使用&号,但应用程序停止了。
如何从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 );
}
Run Code Online (Sandbox Code Playgroud)
在C语言中,&变量之前的字符并不表示“此物是指针”。不,当您将&变量放在前面时,它的意思是“使我成为对此的指针”。
所以当你打电话
myfunction(&pipelineParms);
Run Code Online (Sandbox Code Playgroud)
您有一个变量pipelineParms,并创建了一个指向它的指针,这就是您传递给的指针myfunction。
然后,in myfunction中parms是一个指针(特别是指向type的指针ovrVkGraphicsPipelineParms。希望pipelineParmsin 也main为type ovrVkGraphicsPipelineParms。)
因此,在中myfunction,如果要将指针传递到anotherfunction,只需传递它:
anotherfunction(parms);
Run Code Online (Sandbox Code Playgroud)
我们可以看到它anotherfunction也接受一个指向type的指针ovrVkGraphicsPipelineParms,所以这是正确的。
当您尝试致电时anotherfunction(&parms),会&说“让我对此有所指点”。因此,您获得了一个指向 type ovrVkGraphicsPipelineParms或or 的指针ovrVkGraphicsPipelineParms **。如果那是anotherfunction期望的,那可能很好,但事实并非如此。
并非C具有正则变量和指向正则变量的指针。您可以指向任何内容。您可以有指向指针的指针,也可以有指向指针的指针,从理论上讲,您也可以有4级,5级和6级指针,一直到12级或更多(尽管实际上3级以上的指针很少见) )。
还有一件事:你说
anotherfunction( &parms ); // compile, but application stopped
Run Code Online (Sandbox Code Playgroud)
但我猜它实际上没有正确编译。我猜您的编译器给了您警告。我的说:
警告:不兼容的指针类型将“ const ovrVkGraphicsPipelineParms **”传递给类型“ const ovrVkGraphicsPipelineParms *”的参数;去掉 &
如果您的编译器没有在该行上发出警告,则建议您尽可能切换到更好的编译器。(现代编译器也会警告您有关void main,这也错了,尽管它不会给您造成任何问题。)