我想声明一个二维数组,但我不知道第一个维度。第二个维度是已知的。
如何声明数组?
我找到了一种语法:
devtools
语法是否正确?但我不明白这种语法。
答案 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个主要优势:
foo
的元素很容易创建和归零:例如要创建两个尺寸5,零尺寸的第二个尺寸,您只需执行:foo.resize(2)
delete
分配内存。一旦foo
超出范围,它就会被清除。是否抛出错误或任何自然范围退出vector
可以参与重新分配和数据复制,因为数组在程序执行过程中动态增长或缩小