【问题标题】:Does this make an array of pointers?这会产生一个指针数组吗?
【发布时间】:2019-02-15 22:31:35
【问题描述】:

所以我正在尝试创建一个动态分配的数组。为此,我正在尝试创建一个指针数组。我使用 typedef 定义指针类型并尝试使用此代码创建指针数组。

emprec * arrptr = new emprec[size];

我的问题是,这是创建指针数组的正确方法吗?如果没有,有什么更好的方法。

emprec 在程序中定义如下

struct emprec
{
int id;
float salary;
};
typedef emprec * emprecptr;
typedef emprec arr[MAXDBSIZE];

(我是一名学生,正在努力学习更多关于动态分配的知识)


在你们的帮助之后,很明显我最初制作了一个 emprec 数组,它是一个结构数组。我不想那样。将代码更改为

emprecptr* DBarray = new emprecptr[dbsize];

现在给我一个指针数组。

【问题讨论】:

  • 这真的取决于emprec 是什么。如果emprec 是一个指针,那么你有一个指针数组,如果不是,那么你没有,你有一个emprec 数组。
  • 您可能不应该拥有原始指针的动态数组。取而代之的是std::vector<std::unique_ptr<emprec>>
  • 你有一个 emprec 数组,不管它们是什么。
  • “我使用 typedef 来定义指针类型”不要那样做!不要在 typedef 中隐藏指针类型。此外,您应该首先学习现代 C++ 习语。然后,在您对此感到满意之后,如果您想深入了解实现的细节,当然,请选择指针和手动内存管理。或者改为学习 C。

标签: c++ arrays dynamic-memory-allocation


【解决方案1】:

给定

struct emprec
{
    int id;
    float salary;
};

那么,没有

emprec * arrptr = new emprec[size];

不是指针数组,而是emprec 的数组。但是既然你也有typedef emprec * emprecptr;,那么

emprecptr * arrptr = new emprecptr[size];

是一个指针数组(指向emprec)。如果没有typedef,您必须将其写为:

emprec* * arrptr = new emprec*[size];

但正如您所见,typedef 简化了对代码的理解,并可能使其更易于阅读。

【讨论】:

    【解决方案2】:

    第一点是不要混淆指针数组指向数组的指针。你说的是第一个,所以我要相信你的话。但是,如果您真的指的是第二个,那么接下来的内容就会产生误导。

    一般要创建一个你写的T的动态数组

    T* arr = new T[size];
    

    既然你想要一个指针数组,T 必须是一个指针。例如这里是如何创建一个整数指针数组。

    int** arr = new int*[size];
    

    类似地,指向emprec 的指针数组将是

    emprec** arr = new emprec*[size];
    

    这可以使用你问题中的 typedef 来简化

    emprecptr* arr = new emprecptr[size];
    

    【讨论】:

    • 我想我明白你在说什么。我觉得这正是我所需要的,我编辑了我的原始帖子以包含 emprec 是什么,但我开始认为我最初写的实际上是一个结构数组,但不要引用我的话。有了我提供的其他信息,这将如何改变我正在寻找的解决方案?
    • @Amxela 结构数组与指针数组完全不同。我想你有我在第一句话中提到的困惑。
    • @Amxela 简而言之,您问题中的代码对于结构数组是正确的,我的回答没有帮助
    • 是的,我只是对我最初放下的内容感到困惑。现在看到你的编辑对我来说更有意义。如果我做对了,我将创建一个名为 arr 的新 emprecptr 并将其设置为 emprecptr 数组。这导致动态分配的指针数组。我实际上需要你放的东西,虽然我只是搞砸了我最初创建的东西。
    猜你喜欢
    • 2015-03-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多