如何在c ++中声明第一个维度未知的二维数组?

时间:2015-09-16 10:31:48

标签: c++ arrays 2d

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

如何声明数组?

我找到了一种语法:

devtools

语法是否正确?但我不明白这种语法。

3 个答案:

答案 0 :(得分:0)

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

#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;
}

BTW int (*p)[5]与指向int p[5]的指针相同。

答案 1 :(得分:0)

int (*p) [5];

表示&#34; p是指向五个整数数组的指针&#34;。
该指针可以是以正常方式指向数组的第一个元素的指针。

如果你有一个数组,其元素是int的五元素数组,你可以使用正常的数组到指针转换:

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

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

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

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

答案 2 :(得分:0)

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

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

vector<array<int, 5>> foo;

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

  1. 创建foo的元素很容易创建和归零:例如要创建两个尺寸5,零尺寸的第二个尺寸,您只需执行:foo.resize(2)
  2. 永远不需要delete分配内存。一旦foo超出范围,它就会被清除。是否抛出错误或任何自然范围退出
  3. vector可以参与重新分配和数据复制,因为数组在程序执行过程中动态增长或缩小
  4. 如果这是一个使用正确构造和复制本身的容器的成员变量,则允许您使用默认生成的构造函数,赋值运算符和析构函数
  5. [Live Example]