首页 > 解决方案 > 参数中的指针,&符号?

问题描述

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

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

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

标签: cpointersparameter-passingampersand

解决方案


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

所以当你打电话

myfunction(&pipelineParms);

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

然后, inmyfunctionparms一个指针(特别是指向 type 的指针ovrVkGraphicsPipelineParms。希望pipelineParmsinmain也是 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,这也是错误的,尽管它不会给您带来任何问题。)


推荐阅读