我试图在C中创建一个全局二维整数数组,但我不确定如何去做。对于1D数组,您可以简单地输入
int numbers[];
但是显然不能像
那样留下两个空括号int numbers[][];
那么我该怎么做呢?我不确定是否有简单的方法。
谢谢!
为了构造一个2D数组,思路是创建一个扁平的2D数组(因此,一个1D数组)。这实际上意味着所有的列都是水平放置的,一个接一个。为了访问这些元素,你需要计算一个索引。
假设您的数组将有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;
}
你可以在这里阅读更多关于二维数组的动态内存分配,以了解内存中发生了什么。
最后,根据你的问题让我注意你不能声明:
int numbers[];
,因为编译器需要一个指示来知道大小
为此需要一个指向int的指针。C语言没有内置的二维数组,但你有办法解决这个问题。这里有两个选项:
通过辅助函数模拟二维数组
你要么模拟第二次元;为此,我建议使用辅助函数,类似于:
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处设置value为10,如下setTwoDimensionArray(&myArray, 5,2,2,10);
然后,如果你想要返回值:int value = getTwoDimensionArray(&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++ h1> 然,如果你可以使用c++,你有更多的选择,参见c++中的多维容器
标题>