【问题标题】:C/C++ array of pointers to 2d arrays [duplicate]指向二维数组的指针的 C/C++ 数组[重复]
【发布时间】:2013-03-07 17:41:01
【问题描述】:

我正在尝试获取指向二维布尔数组的指针数组。如何做到这一点? 这是为 Arduino 准备的(认为它们是 C 和 C++ 的混合体?)

【问题讨论】:

标签: c++ c arrays pointers multidimensional-array


【解决方案1】:

根据您的描述,我认为您正在寻找类似的东西:

bool (*arr[K])[M][N];

它分解为

       arr                -- arr
       arr[K]             -- is a K-element array
      *arr[K]             -- of pointers
     (*arr[K])[M]         -- to M-element arrays
     (*arr[K])[M][N]      -- of N-element arrays
bool (*arr[K])[M][N]      -- of bool

【讨论】:

  • 是否可以在不必声明 M 和 N 的情况下声明它,即如果你想拥有不同大小的二维数组?
  • 没有。数组的大小是类型的一部分;例如,bool 的 3x4 元素数组与bool 的 4x5 元素数组是不同的类型,指向其中一个元素的指针与指向另一个元素的指针不兼容。
【解决方案2】:

如果您使用的是 C++,并且不想从声明中输入大小,您可以通过动态分配来做到这一点。

int first_dim, second_dim;
// determine dimensions somewhere inside code

// create array of pointers to booleans
bool** arr[10];
for(i = 0; i < 10; i++){
    arr[i] = new bool*[first_dim];
    for(j = 0; j < first_dim; j++){
        arr[i][j] = new bool[second_dim];
    }
}

确保您在使用完所有阵列后delete

注意

当您尝试分配二维数组时,不要将它们视为矩阵或表格,每个都存储一个布尔值。例如,取一个ints 的数组,一个声明为int arr[i][j] 的数组,第一个“维度”中的每个元素都是int* 类型,第二个“维度”中的每个元素都是int 类型。所以它实际上是一个“数组数组”,如果你愿意的话。

【讨论】:

  • (请注意 OP,虽然这会降低效率,因为二维数组不会是连续的)
  • 也许吧,但他会怎么做呢,因为他不想从一开始就知道first_dimsecond_dim? (参见上面@JohnBode 的回答 cmets)
  • 他可以将每个arr[n] 分配为一维数组而不是二维数组并手动索引arr[n][second_dim * i + j](如果性能很重要,我会这样做)
  • 你的最后一次编辑有点误导,顺便说一句,因为它没有超过 2d(bool arr[i][j][k]bool[i]bool (*)[k],而不是 bool**...见this
  • 我的意思是阅读的人可能会假设T 的3-d 数组的第一个元素可以转换为T**,但事实并非如此;但无论如何,他们可以读取 cmets,所以这没什么大不了的。
【解决方案3】:

指向二维布尔数组的指针数组看起来像这样(在 C 和 C++ 中 - 选择一个,它们不是同一种语言,也不是混合语言):

 typedef bool TwoDBoolArr[10][10];
 typedef TwoDBoolArr *TwoDBoolArrPtr;
 typedef TwoDBoolArrPtr TwoDBoolArrPtrArray[10];

当然,你需要最后一个typedef

如果您希望减少 typedef 并降低可读性:

typedef bool (*TwoDBoolArrPtrArray[10])[10][10];

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2014-11-20
    • 1970-01-01
    • 2017-06-11
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    相关资源
    最近更新 更多