【问题标题】:pointers in argument, ampersand?参数中的指针,&符号?
【发布时间】:2020-02-12 00:51:43
【问题描述】:

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

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

如何从 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 );
}

【问题讨论】:

  • 不要申请&parms 已经是一个指针,应该继续传递。

标签: c pointers parameter-passing ampersand


【解决方案1】:
anotherfunction( &parms ); // compile, but application stopped

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

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

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

【讨论】:

  • 而不是“你不需要&”我会写“使用&是错误的”
  • 我接受另一个更完整的答案,但谢谢。
  • @GUNNM SteveSummit 的回答当之无愧:)。
【解决方案2】:

在 C 语言中,变量前的& 字符并不意味着“这个东西是一个指针”。不,当您将& 放在变量前时,它的意思是“让我成为指向此的指针”。

所以当你打电话时

myfunction(&pipelineParms);

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

那么,在myfunction 中,parms 是一个指针(特别是指向ovrVkGraphicsPipelineParms 类型的指针。希望main 中的pipelineParms 也是ovrVkGraphicsPipelineParms 类型。)

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

anotherfunction(parms);

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

当您尝试调用anotherfunction(&parms) 时,& 说,“给我一个指向此的指针”。所以你得到了一个指向指向类型ovrVkGraphicsPipelineParmsovrVkGraphicsPipelineParms **的指针。如果这是 anotherfunction 所期望的,那可能没问题,但事实并非如此。

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

还有一件事:你说过

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

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

警告:不兼容的指针类型将“const ovrVkGraphicsPipelineParms **”传递给“const ovrVkGraphicsPipelineParms *”类型的参数;删除 &

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

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多