gpt4 book ai didi

c++ - 在 C++ 中初始化指向结构的指针数组

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:21 26 4
gpt4 key购买 nike

可以使用复合文字来初始化 C 中指向结构的指针数组。

typedef struct {
int a;
int b;
} s;

在 C 中:

s *ptrArray[] = {
&(s){
.a = 1,
.b = 2
},
&(s){
.a = 4,
.b = 5
}
};

这在 C++ 中如何完成?

我还看到了在不使用复合语句的情况下在 C++ 中初始化结构的区别:

s s1 = { a: 7, b: 8 };

最佳答案

首先 - 将任何东西初始化为临时值的地址似乎非常可疑,在 C 中也是如此。你确定那是有效的吗?嗯。不管怎样,C++ 编译器真的不会让你那样做。

至于您指定的(命名字段)初始化 C++ 行 - 它实际上是非标准的,它是 GNU C++ 扩展,您不能依赖它。

你可以这样做:

struct s { int a, b; };

int main() {
s data[] = { { 1, 2 }, { 4, 5 } };
// instead of ptrArray[i], use &(data[i])
}

这编译得很好。但是 - 此代码的更像 C++ 的版本是:

#include <array>

struct s { int a, b; };

int main() {
std::array<s, 2> data { s{ 1, 2 }, s{ 4, 5 } };
// instead of ptrArray[i], use &(data[i]),
// or use iterators, or ranged for loops
}

为什么要使用 std::arrayHere's one explanation的好处。实际上,您可以通过以下方式做得更好并减少重复:

int main() {
auto data = make_array(s{ 1, 2 }, s{ 4, 5 });
// instead of ptrArray[i], use &(data[i]),
// or use iterators, or ranged for loops
}

make_array 函数取自 here ;你还有std::experimental::make_array() ,但这还没有标准化。

如果你想在运行时从 data 添加或删除元素,你可以切换到使用 std::vector:

#include <vector>

struct s { int a, b; };

int main() {
std::vector<s> data { s{ 1, 2 }, s{ 4, 5 } };
// instead of ptrArray[i], use &(data[i]),
// or use iterators, or ranged for loops
}

关于c++ - 在 C++ 中初始化指向结构的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49052214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com