繁体   English   中英

将指针传递给需要指针的函数的地址有什么意义?

[英]What's the point of passing address of pointer to function that needs pointer to pointer?

我正在阅读ffmpeg解码示例,它具有将指针的地址传递给函数的地址:

static AVBufferRef *hw_device_ctx = NULL;


if ((err = av_hwdevice_ctx_create(&hw_device_ctx, type,
                                  NULL, NULL, 0)) < 0) {

将指针的地址作为参数传递的意义何在?

我了解,当我们传递指针本身时,如果指针的地址为0x123456 ,则该函数将能够修改此地址中的对象。 但是,当我传递指针的地址时,我传递的是分配该指针号的地址?

如果我理解正确,我正在传递存储0x123456的变量的地址? 为什么功能需要它?

另外,假设我想将hw_device_ctx存储在如下的unique_ptr

std::unique_ptr<AVBufferRed> hw_pointer;

如何将其传递给av_hwdevice_ctx_create 因为我做错事

av_hwdevice_ctx_create(&hw_pointer.get(),...

它说:

expression must be an lvalue or a function designator

传递指针时,按值传递指针。 因此,您可以修改指针指向的变量,但不能修改指针本身。

如果您需要修改指针本身(例如,指向其他地方),则可以通过引用或指针传递它。

引用unique_ptr不起作用的原因是,您正在尝试获取将立即死亡的临时引用。 如果函数接受const ref,它将起作用,但显然这不是您要实现的目标。

您不应修改由智能指针管理的指针。 您可以在函数调用后将指针传递给智能指针。

出于同样的原因,需要将想要修改int的函数传递给可修改int的指针(或引用),这也是出于同样的原因。

也就是说,您的情况与

int f() { return 0; }
void foo(int* x) { *x = 1; }
...
foo(&f());

如果要使用unique_ptr管理生命周期,请让函数先创建对象,然后将其所有权移交给unique_ptr

AVBufferRef *hw_device_ctx = NULL;
if ((err = av_hwdevice_ctx_create(&hw_device_ctx, type,
                                  NULL, NULL, 0)) < 0) {
   ..
}
else
{
    std::unique_ptr<AVBufferRed> hw_pointer(hw_device_ctx);
    ...
}

如果我理解正确,我正在传递存储0x123456的变量的地址?

是的,您理解正确。 您正在传递包含另一个地址的变量的地址。

为什么功能需要它?

在大多数情况下,当传递给该函数的参数通常是设计使然的指针,并且该函数需要修改参数本身(在您的示例中,包含0x123456的变量)时,函数会将指针声明为参数的指针。

如何将其传递给av_hwdevice_ctx_create? 因为我做错事

你不应该 此函数使调用方有责任在使用后释放内存,但是,如果您确实想这样做,则可以使用unique_ptr.get()分配一个变量,然后传递此新变量的地址(这将破坏整个思路)您正在使用的智能指针-在这种情况下,您应该使用原始指针)。

如您所写,将指针传递给某物时,该函数可以修改指针所指向的对象/内存中的数据。 但是您(即您的应用程序)必须自己分配内存。

当您传递指针的地址时,被调用的函数可以分配内存本身,并通过指针返回新分配的对象或内存。
顺便说一句:如果您的应用程序必须再次释放内存,请阅读文档!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM