【发布时间】:2015-09-16 10:31:47
【问题描述】:
我想声明一个二维数组,但我不知道第一维。第二维是已知的。
如何声明数组?
我找到了一种语法:
int (*p) [5];
语法正确吗?但是我不懂这个语法。
【问题讨论】:
-
在 c 或 c++ 中 ????标记
c和标题c++?
我想声明一个二维数组,但我不知道第一维。第二维是已知的。
如何声明数组?
我找到了一种语法:
int (*p) [5];
语法正确吗?但是我不懂这个语法。
【问题讨论】:
c 和标题c++ ?
你必须使用动态内存 ;)...
#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]相同。
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];
【讨论】:
不幸的是,这需要动态内存。
但是如果可以使用标准容器,C++11 提供了array 容器:
vector<array<int, 5>> foo;
与动态内存相比,它提供了 4 个主要优势:
foo 的元素并将其初始化为零:例如,要创建两个大小为 5 的第二维,您只需执行以下操作:foo.resize(2)
delete 分配的内存。一旦foo 超出范围,它将被清理。无论是通过抛出错误还是任何自然范围退出vector 可以处理数组在程序执行过程中动态增长或缩小时的重新分配和数据复制【讨论】: