二维数组的定义
二维数组的定义方式: 数组名[常量表达式][常量表达式]
二维数组定义允许在声明时指定数组的行数和列数。其中,常量表达式可以是一个整数常量、宏定义、枚举常量或者由这些构成的表达式,用于确定数组的大小。需要注意的是,这种方式中声明时列数不能省略,而行数可以省略。例如:
// 声明一个3行4列的整数类型数组
int array[3][4];
// 可以只指定行数,而列数不能省略
int array2[][5]; // 未指定行数,指定了列数为5
二维数组的理解
列 | 列 | 列 | 列 | 列 | int a[3][4]定义方式可以看作是一个3行4列的矩阵,其中3表示行数,4表示列数。可以使用下标访问每个元素,如**a[i][j]**表示访问第i行、第j列的元素。a[i]可看作一维数组,且每个一维数据具有j个元素 | |
---|---|---|---|---|---|---|
行 | a[0] | a[0][0] | a[0][1] | a[0][2] | a[0][3] | |
行 | a[1] | a[1][0] | a[1][1] | a[1][2] | a[1][3] | |
行 | a[2] | a[2][0] | a[2][1] | a[2][2] | a[2][3] |
二维数组元素的引用
对于二维数组,可以使用以下形式来引用其元素:
数组名[下标1][下标2]
其中,下标1表示行索引,下标2表示列索引,这样可以访问和修改二维数组中的特定元素。
二维数组的初始化方式可以分为以下两种:
- 分行初始化:在初始化时,可以分行对二维数组进行初始化。
// 分行初始化
int array[2][3] = {
{1, 2, 3}, // 第一行的值
{4, 5, 6} // 第二行的值
};
//分行部分初始化
int a[ ][3]={{1},{4,5}};
/*
存储顺序:
a[0][0]=1;
a[0][1]=0;
a[0][2]=0;
a[1][0]=4;
a[1][1]=5;
a[1][2]=0;
*/
2.按元素列表顺序初始化:也可以按照元素列表的顺序进行初始化。
// 按元素列表顺序初始化
int array[2][3] = {1, 2, 3, 4, 5, 6};
数组元素的存放顺序
在内存中,二维数组按行序优先的存储方式意味着将二维数组按行展开成一维的存储结构。这意味着在内存中,二维数组的元素是按照优先顺序存储的,而不是按照二维结构存储。
举个例子,对于一个3行4列的二维数组,按行序优先的存储方式会将每一行的元素依次存储在一维数组中。假设我们有以下二维数组:
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
按行序优先存储的一维表示方式如下:
int a[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
这样的存储方式使得对于二维数组的元素可以通过一维数组的索引进行访问。例如,a[1][2]可以转换为a[1 * 列数 + 2]。在内存中按行序优先存储的方式使得对二维数组的线性遍历更加高效,因为连续的内存访问有利于提高缓存的命中率。
二维数组例程
int main(int argc,char *argv[])
{
int a[2][3];
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%p",&a[i][j]);
}
putchar('\n');
}
printf("%p %d\n",a,sizeof(a));
//a++;二维数组名同为地址常量
return 0;
}