我正在学习如何在Linux中为ALSA编程,并且有一段代码如下:
snd_pcm_t * _soundDevice;
bool Init(const char *name)
{
int i;
int err;
snd_pcm_hw_params_t *hw_params;
if( name == NULL )
{
// Try to open the default device
err = snd_pcm_open( &_soundDevice, "plughw:0,0", SND_PCM_STREAM_PLAYBACK, 0 );
}
如您所见,它首先创建指向结构snd_pmc_t
的指针并将其命名为_soundDevice
。但是,代码的其他部分仅使用第一个指针:
if ((err = snd_pcm_hw_params_any (_soundDevice, hw_params)) < 0)
我理解指向结构的指针有助于作为参数传递,因为将整个结构作为副本传递会很糟糕,我也理解这个函数会修改指针所指向的结构的内容,但是为什么有人需要指向结构的指针?
答案 0 :(得分:3)
为什么有人需要指向结构的指针?
当你需要以一种允许函数改变指针所指向的方式将指针传递给函数时,这通常会显示出来。一种惯用的C方式是通过指针传递指针,从而产生你想知道的第二级间接。
在您的示例snd_pcm_open
中修改其第一个参数(即使_soundDevice
指向某个新位置),而snd_pcm_hw_params_any
则不会。
如果snd_pcm_open
取snd_pcm_t*
而不是snd_pcm_t**
,则无法以传播回调用方的方式重新指定第一个参数。< / p>
答案 1 :(得分:1)
在C中,参数传递是按值(或者如果您愿意,可以通过复制传递),因此如果您希望函数修改传递的参数,则需要传递其地址。
答案 2 :(得分:0)
指向指针允许函数修改本地指针。如果只传递一个常规指针,该函数会在堆栈上获取该指针。如果它修改了(指针的值,而不是指向的数据),当函数返回的方式与传递给函数的int的更改将丢失的方式相同时,该值将丢失。如果您改为将指针传递给指针,它可以修改您的指针,该指针在函数返回后仍然存在。
例如,如果函数为该结构分配内存,则可以将指针设置为新分配的内存的地址,如果分配失败则设置为NULL。在这种情况下,它看起来像是用作第二个返回值。它希望将错误代码作为实际返回值返回,将指针作为第二个值返回。
答案 3 :(得分:0)
有时目标不是更改对象,而是更改指向它的指针。
想象一下在几个函数中选择的函数“A”
int A(someType* funcChosen)
{
funcChosen = ...; //a pointer to a function
}
someType* myFunc;
int res = A(myFunc);
将修改myFunc
。但是你需要一个指向该函数的指针,而不是它的代码(??)。那么更好:
int A(someType** funChosen);
someType* myFunc;
int res = A(&myFunc);