论点中的指针,&符号?

pointers in argument, ampersand?

我将一个指针传递给一个函数,我可以从该指针访问结构的成员。

在这个函数中,我需要用相同的指针作为参数调用另一个函数。 我使用了符号,但应用程序已停止。

如何从 myfunction() 调用另一个函数()?

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 );
}
anotherfunction( &parms ); // compile, but application stopped

您已经有 parms 作为指针,您不需要 &

anotherfunction( parms ); // compile, but application stopped

如果您将 & 附加到 parms,它将变为 onst ovrVkGraphicsPipelineParms **

在 C 中,变量前的 & 字符并不表示 "this thing is a pointer"。不,当你把 & 放在变量之前时,它意味着 "make me a pointer to this".

所以当你打电话时

myfunction(&pipelineParms);

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

然后,在 myfunction 中,parms 是一个指针(具体来说,是指向类型 ovrVkGraphicsPipelineParms 的指针)。希望 main 中的 pipelineParms 是类型ovrVkGraphicsPipelineParms 还有。)

所以在myfunction中,如果你想将指针传递给anotherfunction,只需传递它:

anotherfunction(parms);

我们可以看到 anotherfunction 也接受一个指向类型 ovrVkGraphicsPipelineParms 的指针,所以这是正确的。

当您尝试呼叫 anotherfunction(&parms) 时,& 说 "make me a pointer to this"。所以你得到了一个指向 的指针,一个指向 类型 ovrVkGraphicsPipelineParmsovrVkGraphicsPipelineParms ** 的指针。如果那是 anotherfunction 所期望的,那可能没问题,但事实并非如此。

不是说C有正则变量,还有指向正则变量的指针。你可以有指向任何东西的指针。你可以有指针指向指针,指针指向指针指向指针,理论上你也可以有 4 级、5 级和 6 级指针,一直到 12 级或更多(尽管实际上超过 3 级的指针是非常罕见的).

还有一件事:你说

anotherfunction( &parms ); // compile, but application stopped

但我猜它实际上没有正确编译。我猜你的编译器给了你一个警告。我的说:

warning: incompatible pointer types passing 'const ovrVkGraphicsPipelineParms **' to parameter of type 'const ovrVkGraphicsPipelineParms *'; remove &

如果您的编译器没有在该行给您警告,我鼓励您尽可能切换到更好的编译器。 (现代编译器也会警告您 void main,这也是错误的,尽管它不会给您带来任何问题。)