在C / C ++中使用单个初始化初始化具有相同值的多个指针

时间:2017-01-29 03:37:46

标签: c++ c pointers

我想在C / C ++中使用单个赋值运算符声明两个或多个具有相同值的指针?以下代码是一个示例:

List* a = NULL; 
List* b = NULL;
List* c = NULL;

一行中是否有等价物?

编辑:为了澄清,我正在寻找两种语言的答案。我用了一个'斜杠(/)'在愿意回答一种语言的人的情况下分开。谢谢。

4 个答案:

答案 0 :(得分:5)

List *a = NULL, *b = NULL, *c = NULL;

List *a, *b, *c;
a = b = c = NULL;

请注意,在C ++ 11中,您应该避免NULL宏支持nullptr

答案 1 :(得分:3)

严格地说,你的例子中没有任何作业 - 它们是初始化,因为所有三行都是声明(实际上,大多数情况下都是定义)。

可以将示例包装成一行

 List *a = NULL, *b = NULL, *c = NULL;

但请注意,这会重复使用" = NULL"用于初始化每个。另请注意需要额外的星号(*),因为如果没有这些,并非所有变量都是指针。请注意,在这样的一行中放置多个声明或定义被认为是不好的样式,因为很容易忘记其中一个*或其中一个初始化者,并获得与预期完全不同的结果(单元化{{1}变量未初始化为零)。

如果您愿意将声明与初始化分开,则可以

auto

如果定义是全局变量,则默认初始化为零,所以

 List *a, *b, *c;
 a = b = c = NULL;

将所有三个初始化为 // assume at file scope (outside any function) List *a; List *b; List *c; // equivalently: List *a, *b, *c; 。然而,这对于初始化为其他(非零)值不起作用。在函数(或块)中,通过在NULL之前进行上述操作,可以实现相同的功能。

在C ++ 11中,可以执行

static

不使用三个命名变量,而是可以使用数组。

 List *a{}, *b{}, *c{};

可以简化为

 List *a[3] = {NULL, NULL, NULL};

因为在这种情况下缺少的初始化器将导致相应的元素初始化为零。

在C ++ 11及更高版本(仅)中,数组初始化可以 - 如AnT在评论中指出的那样 - 简化为

 List *a[3] = {NULL};

 List *a[3] = {};

在C ++中,通常鼓励(与C不同)将 List *a[3]{}; NULL或(来自C ++ 11)的所有用法替换为0

答案 2 :(得分:1)

使用c ++ 11,您可以这样做:

int* a{}, *b{}, *c{};

答案 3 :(得分:0)

无法在C中使用单个赋值声明和初始化多个变量。

在C ++ 17中,您可以使用结构化绑定获得所需内容:

auto [a, b, c] = std::make_tuple(ptr, ptr, ptr);

如果您不想重复初始化值,则可以通过重复tuple次值来创建N自己的函数:

template <typename T, std::size_t... Is>
auto repeat_impl(T const& x, std::index_sequence<Is...>) {
    return std::make_tuple((Is, x)...);
}

template <std::size_t N, typename T>
auto repeat(T const& x) {
    return repeat_impl(x, std::make_index_sequence<N>());
}

像这样使用:

auto [a, b, c] = repeat<3>(ptr);

虽然您可以使用array

完成初始化为null的具体示例
auto [a, b, c] = std::array<List*, 3>();

在C ++ 11中,您可以做的最好的事情是使用tie将对象与其声明分开初始化:

List *a, *b, *c;
std::tie(a, b, c) = repeat<3>(ptr);