如何创建多维数组,其维度基于C中的变量?
基本上,我希望能够在终端中键入维度n,并创建相应的n-D数组如何创建多维数组,其维度基于C中的变量?,c,arrays,multidimensional-array,dynamic,C,Arrays,Multidimensional Array,Dynamic,基本上,我希望能够在终端中键入维度n,并创建相应的n-D数组 现在我只能创建一个具有相应n-D数组大小的一维数组。你不能,数组的维数是类型的一部分,因此需要在编译时知道。你可以做一些简单的数学运算,把你想要的映射到一个一维数组 例如: 设尺寸=3 w:4 h:8 d:16 代码: 一般实现可能如下所示 int numDimensions; printf("Enter number of dimensions:"); scanf("%d", &numDimensions); int*
现在我只能创建一个具有相应n-D数组大小的一维数组。你不能,数组的维数是类型的一部分,因此需要在编译时知道。你可以做一些简单的数学运算,把你想要的映射到一个一维数组 例如: 设尺寸=3
- w:4
- h:8
- d:16
int numDimensions;
printf("Enter number of dimensions:");
scanf("%d", &numDimensions);
int* dimensionSizes = (int*)malloc(sizeof(int) * numDimensions);
//Read each dimension's size
int totalElements = 1;
for(int i = 0; i < numDimensions; ++i){
printf("Enter size for dimension %d:", i);
scanf("%d", &dimensionSizes[i]);
totalElements *= dimensionSizes[i];
}
//allocate 1d array
int* data = (int*) malloc(sizeof(int) * totalElements);
//Read the coordinates you want to store data to
int* position = (int*)malloc(sizeof(int) * numDimensions);
for(int i = 0; i < numDimensions; ++i){
printf("Enter location in dimension %d:", i);
scanf("%d", &position[i]);
}
//Read the value you want to store
int value;
printf("Enter value for that position:");
scanf("%d", &value);
//Write the data to the calculated 1d location
data[to1d(position, dimensionSizes, numDimensions)] = value;
int to1d(int* position, int* dimensionSizes, int numDimensions){
int multiplier = 1;
int position1d = 0;
for (int i = 0; i < numDimensions; ++i){
position1d = position1d + position[i] * multiplier;
multiplier = multiplier * dimensionSizes[i];
}
return position1d;
}
int numDimensions;
printf(“输入尺寸编号:”);
scanf(“%d”和numDimensions);
int*尺寸=(int*)malloc(sizeof(int)*numDimensions);
//读取每个维度的大小
整数元素=1;
对于(int i=0;i
不能,数组的维数是类型的一部分,因此需要在编译时知道。你可以做一些简单的数学运算,把你想要的映射到一个一维数组
例如:
设尺寸=3
- w:4
- h:8
- d:16
int numDimensions;
printf("Enter number of dimensions:");
scanf("%d", &numDimensions);
int* dimensionSizes = (int*)malloc(sizeof(int) * numDimensions);
//Read each dimension's size
int totalElements = 1;
for(int i = 0; i < numDimensions; ++i){
printf("Enter size for dimension %d:", i);
scanf("%d", &dimensionSizes[i]);
totalElements *= dimensionSizes[i];
}
//allocate 1d array
int* data = (int*) malloc(sizeof(int) * totalElements);
//Read the coordinates you want to store data to
int* position = (int*)malloc(sizeof(int) * numDimensions);
for(int i = 0; i < numDimensions; ++i){
printf("Enter location in dimension %d:", i);
scanf("%d", &position[i]);
}
//Read the value you want to store
int value;
printf("Enter value for that position:");
scanf("%d", &value);
//Write the data to the calculated 1d location
data[to1d(position, dimensionSizes, numDimensions)] = value;
int to1d(int* position, int* dimensionSizes, int numDimensions){
int multiplier = 1;
int position1d = 0;
for (int i = 0; i < numDimensions; ++i){
position1d = position1d + position[i] * multiplier;
multiplier = multiplier * dimensionSizes[i];
}
return position1d;
}
int numDimensions;
printf(“输入尺寸编号:”);
scanf(“%d”和numDimensions);
int*尺寸=(int*)malloc(sizeof(int)*numDimensions);
//读取每个维度的大小
整数元素=1;
对于(int i=0;i
使用指向指针的指针/双指针(**
)。对于n-D数组,在循环中重复动态分配(malloc
)n次,并使用指向新分配数组的指针引用每个数组。唯一的问题是最后一个数组不使用双指针,因此运行时代码必须知道何时在最后一个维度使用值而不是双指针。使用此功能,您仍然可以通过常规语法进行设置/获取,如M[1][2][3][1]=5代码>(请注意,0是第一个元素!)
还要确保初始化您的值
关于双数组指针的一个很好的例子和论述,请查阅Kerningham/Richie提供的“C编程语言”,该语言可以在线获得
注意:对于这个问题,还有其他优雅和不那么优雅的解决方案。例如,使用宏/元编程在编译时编写分配代码,并传递定义选项(-DDIMS=4
)或表示树等数组的可嵌套数据结构(查看多维数组的经典数据结构文献)。使用指向指针/双指针的指针(**
)。对于n-D数组,重复动态分配过程(malloc
)n在循环中执行多次,并使用指向新分配数组的指针引用每个数组。唯一的问题是最后一个数组不使用双指针,因此运行时代码必须知道何时使用值而不是最后一个维度的双指针。使用此方法,您仍然可以通过常规语法(如M[1][2][3][1]=5;
(注意0是第一个元素!)
还要确保初始化您的值
关于双数组指针的一个很好的例子和论述,请查阅Kerningham/Richie提供的“C编程语言”,该语言可以在线获得
注意:对于这一点,还有其他优雅而不那么优雅的解决方案。例如,使用宏/元编程在编译时编写分配代码,并传递定义选项(-DDIMS=4
)或表示树等数组的可嵌套数据结构(请查阅经典数据结构文献了解多维数组)您可以在运行时使用VLA.Variable length设置数组的大小
数组是C99的一部分。因此这只适用于C99或更高版本。尽管C11有VLA作为选项,但所有主要编译器都支持它
假设您希望用户从t输入2D数组的大小
#include <stdio.h>
int main(void)
{
unsigned int row1, col1;
printf("%s", "Enter number of rows and columns in a 2-D array: ");
int row1, col1; // number of rows and columns in a 2-D array
scanf("%u %u", &row1, &col1);
int array2D[row1][col1]; // declare 2-D variable-length array
}