【问题标题】:How do I declare an two dimension array in c++ whose first dimension is not known?如何在 C++ 中声明一个二维数组,其第一维未知?
【发布时间】:2015-09-16 10:31:47
【问题描述】:

我想声明一个二维数组,但我不知道第一维。第二维是已知的。

如何声明数组?

我找到了一种语法:

int (*p) [5];

语法正确吗?但是我不懂这个语法。

【问题讨论】:

标签: c++ arrays 2d


【解决方案1】:

你必须使用动态内存 ;)...

#include <stdlib.h>
#include <stdio.h>

#define KNOWN_DIMENSION 16

int main() {
    size_t unknownDimension = rand() % 32 + 1;

    int **dynamic = malloc(unknownDimension * sizeof(int*));
    if(dynamic == NULL) {
        fprintf(stderr, "Unable to allocate\n");
        return -1;
    }

    for(size_t i = 0; i < unknownDimension; i++) {
        dynamic[i] = malloc(KNOWN_DIMENSION * sizeof(int));
        if(dynamic[i] == NULL) {
            fprintf(stderr, "Unable to allocate\n");
            return -1;
        }
    }

    // `dynamic` is usable as an `int[unknownDimension][KNOWN_DIMENSION]` here!

    for(size_t i = 0; i < unknownDimension; i++)
        free(dynamic[i]);

    free(dynamic);
    return 0;
}

顺便说一句int (*p)[5] 与指向int p[5] 的指针相同。

【讨论】:

  • 不,int (*p)[5] int p[5]相同。
  • @EnzoFerber:谢谢!那只是一个错字。
【解决方案2】:
int (*p) [5];

表示“p 是一个指向五个整数数组的指针”。
这个指针可以是一个指向数组第一个元素的指针。

如果你有一个数组,它的元素是ints的五元素数组,你可以使用普通的数组到指针的转换:

int array[10][5] = {};
int (*p)[5] = array;

int (*p)[5] = &array[0];

您当然也可以动态分配,我怀疑您想这样做:

int (*p)[5] = new int[10][5];

【讨论】:

    【解决方案3】:

    不幸的是,这需要动态内存。

    但是如果可以使用标准容器,C++11 提供了array 容器:

    vector<array<int, 5>> foo;
    

    与动态内存相比,它提供了 4 个主要优势:

    1. 很容易创建foo 的元素并将其初始化为零:例如,要创建两个大小为 5 的第二维,您只需执行以下操作:foo.resize(2)
    2. 永远不需要delete 分配的内存。一旦foo 超出范围,它将被清理。无论是通过抛出错误还是任何自然范围退出
    3. vector 可以处理数组在程序执行过程中动态增长或缩小时的重新分配和数据复制
    4. 如果这是使用正确构造和复制自身的容器的成员变量,则允许您使用默认生成的构造函数、赋值运算符和析构函数

    [Live Example]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 2022-01-15
      • 2010-12-21
      • 2012-02-27
      • 2018-06-29
      • 2019-09-25
      • 2010-11-11
      相关资源
      最近更新 更多