论点中的指针,&符号?
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"。所以你得到了一个指向 的指针,一个指向 类型 ovrVkGraphicsPipelineParms
或 ovrVkGraphicsPipelineParms **
的指针。如果那是 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
,这也是错误的,尽管它不会给您带来任何问题。)
我将一个指针传递给一个函数,我可以从该指针访问结构的成员。
在这个函数中,我需要用相同的指针作为参数调用另一个函数。 我使用了符号,但应用程序已停止。
如何从 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"。所以你得到了一个指向 的指针,一个指向 类型 ovrVkGraphicsPipelineParms
或 ovrVkGraphicsPipelineParms **
的指针。如果那是 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
,这也是错误的,尽管它不会给您带来任何问题。)