我尝试用for循环创建一系列多维数组。用户应输入要初始化的数组数。我想要这样写:
int i;
printf("Enter the number of arrays you want: ");
scanf("%d",i)
for(int j=0;j<i;j++){
long double x(j)[size][size];
}
如果我输入5,我希望得到x0 x1 x2 x3和x4
这是可能的吗?
谢谢你的帮助。
最诚挚的问候,埃姆雷.
Edit:刚刚注意到您正在使用c++。在这种情况下,std::vector绝对是最方便的解决方案。如果您对如何使用C风格的普通数组实现这一点感到好奇,请阅读…
你不能这样做。你需要做的是创建一个三维数组(或者一个二维数组的数组,这取决于你的观点…)
和C语言一样,内存分配是一个痛苦的过程。你可以静态地分配:
long double x[N][size][size];
(N在编译时确定。确保你有足够大的。另外,如果N真的很大,可以静态地声明数组(作为全局变量或使用static
关键字)。如果你不这样做,你可能会得到堆栈溢出。)
或者你可以使用动态内存分配:
long double (*x)[size][size]; // x is a pointer to size by size arrays
x = malloc(n * sizeof(*x));
//You can now use x[j][a][b]...
也许事情看起来更好的类型定义(即使我不是100%确定我得到了数组声明正确的最后一个例子…):
typedef long double typename_here[size][size];
typename_here *x;
x = malloc(n * sizeof(typename_here);
顺便说一句,你当前的代码不能工作的原因是
-
x(j)
语法是虚构的:) 在循环中声明的变量是该块的内部变量。这意味着你不能在循环体之后访问它们。
如果你在c++中工作,你最好应该使用std::vector
作为:
//single dimensional array of double of size 20
std::vector<double> v1double (20);
//use like v[i] where 0 <= i < 20
//two dimensional array of double of size (10 * 20)
std::vector<std::vector<double> > v2double(10, v1double );
//use like v[i][j] where 0 <= i < 10 and 0 <= j < 20
//three dimensional array of double of size (5 * 10 * 20)
std::vector<std::vector<std::vector<double> > v3double (5, v2double);
//use like v[i][j][k] where 0 <= i < 5 and 0 <= j < 10 and 0 <= k < 20
一组多维数组就是多了一个维度的多维数组。
还有,关于内置数组的一些事情:- 在c++中,内置数组的尺寸必须基于编译时常数。你不能计算大小,从文件中读取它,从用户输入中获取它,等等
- 要创建一个可变大小的内置数组,你必须分配内存,并像使用指针一样使用它
- 要在C和c++之间可移植内置数组的分配,必须使用
malloc
,并确保稍后在从malloc
获得的所有内容上调用free
(有时很难获得正确)
如果你正在使用c++,并且不需要用C编译器编译你的代码,我建议使用vector
而不是内置数组。vector不必有固定的大小,只要你想调整它们的大小就可以调整,通常不需要在代码中调用malloc
或new
#include<iostream>
#include<vector>
int main(int argc, char* argv[])
{
std::cout << "Enter the number of arrays you want:" << std::endl;
const int size = 4;
const int initial_value = 0;
int i;
std::cin >> i;
std::vector<int> sub_sub_array(size, initial_value);
std::vector<std::vector<int> > sub_array(size, sub_sub_array);
std::vector<std::vector<std::vector<int> > > array(i, sub_array);
array[0][1][2] = 5;
// Print out the full array contents
for(size_t i = 0; i < array.size(); ++i)
{
for(size_t j = 0; j < size; ++j)
{
for(size_t k = 0; k < size; ++k)
{
std::cout << "(" << j << ", " << k << ") - " << array[i][j][k] << ", ";
}
std::cout << "n";
}
std::cout << "n";
}
}
编辑:输入数组的个数:
2(0,0) - 0 (0,1) - 0 (0, 2) - 0, (0, 3) - 0,
(1,0) - 0,(1,1) - 0(1、2)—— 5 , (1,3) - 0,
(2,0) - 0, (2, 1) - 0, (2, 2) - 0, (2,3) - 0,
(0) 3 - 0, (3,1) - 0, (2) - 0, (3,3) - 0,(0,0) - 0 (0,1) - 0 (0, 2) - 0, (0, 3) - 0,
(1,0) - 0,(1,1) - 0 - 0(1、2),(1,3)- 0,
(2,0) - 0, (2, 1) - 0, (2, 2) - 0, (2,3) - 0,
(0) 3 - 0, (3,1) - 0, (2) - 0, (3,3) - 0,
上述解决方案的唯一问题是,您可能会或可能不会在需要内置数组的代码中使用它。从你的评论来看,你需要它。
如果您现有的代码可以一次接受一行,那么上述解决方案将工作。如果它只能接受2d数组,你就必须使用不同的矢量结构。看这个问题的原因:
传递嵌套c++ vector作为内置风格多维数组
如果您需要一组连续的2d数组,这里有一些选项:
std::vector<int*> array_instances(i);
for(size_t j = 0; j < array_instances.size(): ++j)
array_instances[j] = new int[size * size];
for(size_t j = 0; j < array_instances.size(); ++j)
existing_code(array_instances[j]);
// When done with the arrays
for(size_t j = 0; j < array_instances.size(): ++j)
delete[] array_instances[j]; // Make sure to include the brackets after "delete"
或:
std::vector<int> template_array(size * size, 0);
std::vector<std::vector<int> > array_instances(i, template_array);
for(size_t j = 0; j < array_instances.size(); ++j)
existing_code(&array_instances[j][0]);