【问题标题】:C++ For Loops, Multi-Dimensional Arrays, and Pointers ExerciseC++ For 循环、多维数组和指针练习
【发布时间】:2012-10-28 21:50:00
【问题描述】:

我的主要问题是:

有没有更好(或更有效)的方法来使用指针声明多维数组?我的所作所为是否走在正确的轨道上?

编程练习:

你卖了C++ for Fools这本书。使用二维数组存储 3 年月销售额的输入(以书籍数量而非金钱数量计算)。报告合并年份的总销售额。程序应该使用循环来按月份提示您,使用字符串对象数组,初始化为月份字符串并将输入数据存储在二维数组中。然后,程序应该找到数组内容的总和,并报告 3 年的总销售额。

这是我的代码的SNIPPET

/* Global constants */
const unsigned int YRS = 3;
const unsigned int MNTHS = 12;

/* Create 2D-Array */
int** bookSalesArrayPtr = new int*[YRS];    // Pointer-to-Array-of-Pointers
for (unsigned int i = 0; i < YRS; ++i)      // Each element of bookSalesArrayPtr
    bookSalesArrayPtr[i] = new int[MNTHS];  // In each element create new array[12]

这里是我完整源代码的链接:http://ideone.com/LcQeuj

【问题讨论】:

  • 我知道我可以使用在任何函数(全局)之外声明的二维数组,并且不需要指针。除了全局声明方式,以及我在代码中这样做的方式:还有哪些其他方式?我正在学习结构化编程入门课程(不是完整的 OOP 课程)。初学者编程。
  • 您可以将数组声明为全局的,并且可以消除指针。但这些事情彼此无关,你可以两者都做,或者一个都做,或者一个都不做。您选择的方式是使用指针的典型方式。我想到的唯一另一种方法是将您的第二维分配为 YRS*MNTHS 整数的分配,而不是 MNTHS 整数的 YRS 分配。
  • @john:你的意思是创建一个大块,而不是一个官方的二维数组?我这样做了,它奏效了,但我的教授特别想要一个二维数组,所以我不得不找到一个不同的解决方案。谢谢你,约翰。
  • 这就是我的想法(抱歉没有格式化)。 int** bookSalesArrayPtr = new int*[YRS]; int* largeBlock = new int[YRS*MNTHS]; for (unsigned int i = 0; i &lt; YRS; ++i) bookSalesArrayPtr[i] = &amp;largeBlock[i*MNTHS]; 和你的版本在结构上是一样的,但是可以说是优化的,因为它只进行了两次分配

标签: c++ pointers multidimensional-array


【解决方案1】:

任何解决方案都应该尽可能简单。如果不需要指针,请避免使用指针,因为它们会使程序复杂化:

int  bookSales[YRS][MNTHS];

请注意阅读这篇文章是多么容易。请注意没有代码来管理分配、销毁或任何其他簿记。

即使这样的结构增加了执行时间(这在此处是极不可能的),考虑一下这节省了多少人力时间(开发人员、维护人员、调试人员、文档)。电脑时间很便宜。人的时间很宝贵。

在评估解决方案时,通常会忽略人力成本。

【讨论】:

  • +1,只是因为。这种风格没有一件事,没有一件事是错误的。一方面,它使内存保持紧凑,这在开始使用复杂矩阵算法时非常重要。另一方面,它避免了内存指针并避免了内存分配。
  • 这种风格有问题。使用std::array(与 C 样式数组一样“紧凑”)。在 C++ 中没有理由使用 C 风格的数组。另请参阅codepuppy.co.uk/cpptuts/CClass/CArrays.aspx
  • BS。这里不需要std::vectorstd::array。与编译时 2D 矩阵相比,数组数组或向量向量在内存访问和内存定位方面非常不理想。
  • +1 因为对回答问题的完美答案的毫无根据的反对票。
  • @David:你确实知道std::array是一个“编译时”数组,它的布局和内存访问与C风格的数组完全相同,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多