我正在尝试在C中创建一个全局的2D整数数组,但我不确定如何去做。对于1D阵列,您只需输入
即可int numbers[];
但显然你不能把两个括号留空,如
int numbers[][];
那我怎么能这样做?我不确定一个简单的方法。
谢谢!
答案 0 :(得分:0)
为了构建一个二维数组,我们的想法是创建一个 展平的二维数组 (因此,一维数组) 即可。这实际上意味着所有列将水平放置,一个接一个。您需要计算索引才能访问元素。
假设您的数组将包含N
行和M
列。您不能将其声明为:
int numbers[N][M];
您可以做的是将其声明为:
int numbers[N*M];
所以你的元素将在[0,N * M-1]的范围内。然后,您可以使用索引访问数组的任何元素:
i*M + j;
其中0 <= i <= N-1
和0 <= j <= M-1
。
但是,鉴于大小未知,我建议您使用动态内存分配而不是2D数组。您可以执行以下操作。首先,声明指向的指针,它实际上是指向2D数组的第一个元素的指针:
int **numbers;
然后,为2D结构分配内存:
int i;
numbers = malloc( N*sizeof(int *) ); // N is the number of the rows
if (numbers == NULL)
return;
for (i = 0 ; i < N ; i++)
{
numbers[i] = malloc( M*sizeof(int) ); // M is the number of the columns
if (numbers[i] == NULL)
return;
}
您可以阅读有关2D数组here的动态内存分配的更多信息,以了解内存中发生的情况。
最后,根据您的问题,请注意您不能声明:
int numbers[];
因为编译器需要一个指示来知道大小。
答案 1 :(得分:-2)
为此目的,您需要一个指向int的指针。 C没有bultin 2D数组,但你有办法解决这个问题。你有两个选择:
要么模拟第二维;我建议为此目的使用辅助函数,例如:
int getTwoDimensionArray(int ** array, int rowSize, int x, int y)
{
return (*array)[x + y*rowSize];
}
void setTwoDimensionArray(int ** array, int rowSize, int x, int y, int value)
{
(*array)[x + y*rowSize] = value;
}
假设您要动态分配5x7数组,您可以使用以下函数:
首先分配1D阵列:
int * myArray = (int*) malloc(5*7);
之后,您将在位置x = 2,y = 2时将值设置为10 setTwoDimensionArray(&amp; myArray,5,2,2,10);
以后,如果你想取回价值: int value = getTwoDimensionArray(&amp; myArray,5,2,2);
int getTwoDimensionArray(int ** array, int rowSize, int x, int y)
{
return (*array)[x][y];
}
void setTwoDimensionArray(int ** array, int rowSize, int x, int y, int value)
{
(*array)[x][y] = value;
}
数组数组的分配:
int ** myArray = (int**) malloc(5);
for ( int i=0; i<5; ++i )
{
myArray[i] = (int*) malloc(7);
}
您可以像使用选项#1一样使用辅助函数
setTwoDimensionArray(&myArray, 5, 2, 2, 10);
int value = getTwoDimensionArray(&myArray, 5, 2, 2);
当然,如果你可以使用C ++,你有更多选择,请参阅Multidimensional Containers in C++