参数中的指针,&符?

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)

Ste*_*mit 6

在C语言中,&变量之前的字符并不表示“此物是指针”。不,当您将&变量放在前面时,它的意思是“使我成为对此的指针”。

所以当你打电话

myfunction(&pipelineParms);
Run Code Online (Sandbox Code Playgroud)

您有一个变量pipelineParms,并创建了一个指向它的指针,这就是您传递给的指针myfunction

然后,in myfunctionparms是一个指针(特别是指向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,这也错了,尽管它不会给您造成任何问题。)