【问题标题】:Can't pass twice pointer with braces不能用大括号传递两次指针
【发布时间】:2019-11-26 07:05:06
【问题描述】:

我有一个功能

void myfunction(A**);

还有一个变量

A a;

我正在尝试创建一个指向 a 内联指针的数组

myfunction( {&a} );

然后失败。它说我正在通过A*。如果我写

A *aa[] = {&a};
myfunction( aa );

然后就可以了。

我可以创建A** 内联吗?

【问题讨论】:

  • 不,表达式&a是一个右值,你不能取它的地址。但是,您可以使用A* pa = &a; myfunction(&pa);
  • 话虽如此,您的myfunction 似乎很可疑,为什么它需要指向指针的指针?它用指针做什么?在我们告诉你真正应该通过什么之前,你需要知道这一点。
  • 我建议你不要成为一个两星程序员。如果您需要一个指针数组,请使用一个指针数组。如果您需要要修改的指针,请引用指针。 C++ 有一个非常好的类型系统,您可以利用它。
  • @Someprogrammerdude 为什么不是常量指针?
  • 如果确实需要处理数组,可以考虑参考std::vectorstd::array作为myFunction的参数。

标签: c++ arrays c++11 pointers


【解决方案1】:

您不能像您所说的那样创建内联 A ** 类型的对象,因为表达式 {&a} 不是数组。

其实和写是一样的

A **p = { &a };

根据 C++ 版本,右侧表达式被视为一个初始化列表或 A * 类型的对象。

在任何情况下这样的初始化都是无效的。

虽然需要中间变量,但您无需创建数组。

你可以写

A *p = &a;
myfunction( &p );

也许您应该考虑重新声明A * & 之类的参数。

您可以像在 C 程序中那样做类似的事情。

这是一个演示程序

#include <stdio.h>

typedef int A;

void myfunction( A **p )
{
    printf( "**p = %d\n", **p );
}

int main( void ) 
{
    A x = 10;

    myfunction( ( int *[] ){ &x } );
}

程序输出是

**p = 10

【讨论】:

  • (int*[]) { &amp;x }不是和{ &amp;x }一样而是强制转换为int*[]类型吗?
  • @Dims 不,不一样。我在回答中展示了参数初始化在 C++ 中的外观。
  • 为什么不一样?
  • (int *[] ){ &amp;x } 在 C++ 中是非法的吗?
  • 您可能想强调您展示的程序是 C 程序,而不是 C++(没有复合文字)。
【解决方案2】:

我正在尝试创建一个包含一个指向内联指针的数组

myfunction( {&a} );

这不起作用,因为&amp;aA*,这是与A** 不同的类型,并且这些类型不能相互转换。

我可以创建 A** 内联吗?

是的,如果你有一个A* 变量:

A* pointer = &a;
myfunction(&pointer);

但不是直接来自A a

【讨论】:

    猜你喜欢
    • 2013-01-13
    • 2017-11-13
    • 2016-08-13
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多