【问题标题】:C++: 2D arrays vs. 1D array differencesC++:二维数组与一维数组的区别
【发布时间】:2009-08-10 19:33:44
【问题描述】:

我有一个浮点数组 rtmp1[NMAX * 3][3],它被用作 rtmp1[i][n],其中 n 是从 0 到 2,i 是从 0 到 3 * NMAX - 1. 但是,我想将 rtmp1 转换为 rtmp1[3 * 3 * NMAX]。将这个新的一维数组寻址为 rtmp1[3 * i + n] 是否等同于 rtmp1[i][n]?提前感谢您的澄清。

【问题讨论】:

  • 我不应该是从 0 到 (3 * NMAX) - 1 吗?
  • 请澄清。你的意思是“i是从0到2”还是rtmp1[3 * 4 * NMAX]?
  • @KTC:是的,我已经更正了@bill weaver:请澄清你的问题。
  • 我认为您的基本问题的答案是肯定的(请参阅下面的答案)。但是,我对您问题第一部分的范围感到困惑。在你的编辑之后,我对他们更加困惑了。

标签: c++ arrays multidimensional-array


【解决方案1】:

rtmp1[i][n] 等价于 rtmp1[i*NMAX + n]

请参阅http://www.cplusplus.com/doc/tutorial/arrays/,您的 NMAX 是它们的宽度。

【讨论】:

  • 我试图做的主要目标是将二维数组转换为伪二维数组。你的回答是我接受的。谢谢。
【解决方案2】:

是的,但是您这样做是为了证明什么? rtmp1[i][n] 很可能有更好的执行时间并且更容易阅读。

“实际上,你想使用 rtmp[i + 3*n]” 有什么区别?你所做的只是交换地址。

【讨论】:

  • 我正在尝试将 rtmp1 动态分配为一维数组,因为直到运行时我才知道它的大小。 NMAX 是一个非常大的静态分配数,当前的实现在内存消耗方面非常贫乏。
【解决方案3】:

我不确定它是否会破坏某些别名预防规则。我的阅读是没问题,但我已经错了,整个领域有时会令人困惑和大胆地知道标准不同部分的两个冲突规则中的哪一个优先。

示例:

typedef float Point[3];

void f(float* tab, Point* pt)
{
   (*pt)[2] = 6;
   // I don't think the compiler can assume that (*pt)[2] isn't modified by
   tab[5] = 3.141592;

}

// context which give a problem if I'm wrong.
float rtmp1[NMAX*3][3];
float *ptr = &rtmpl[0][0];
f(ptr, rtmpl[1]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2010-11-17
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多