【005:二维数组问题】
005:二维数组问题
在 C/C++ 中,我们将使用两个下标的数组称之为二维数组
。相比于一维数组中,下标作为索引的存在,二维数组的下标索引往往带有 行
和 列
的意义。如表示一个四边形的四个二维坐标(x,y)这样的场景,就可以使用二维数组进行存储(使用结构体表示一个点的 x/y 坐标也是可以的)。
1. 二维数组的初始化
方式一:指定数据初始化
int a[3][2] = {0, 1, 2, 3, 4, 5}; // -Wmissing-braces
int a[3][2] = {{0, 1}, {2, 3}, {4, 5}};
方式二:默认初始化
int a[3][2] = {0}; // 全为0
int b[3][2] = {}; // 全为0
int c[3][2]; // 全为随机数
2. 二维数组的访问
方式1:下标式
#include <stdio.h>
int main(int argc, char const *argv[])
{
(void)(argc);
(void)(argv);
int a[3][2] = {{0, 1}, {2, 3}, {4, 5}};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
printf("a[%d][%d]=%d\n", i, j, a[i][j]);
}
}
return 0;
}
方式二: 指针式
#include <stdio.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
(void)(argc);
(void)(argv);
int a[3][2] = {{0, 1}, {2, 3}, {4, 5}};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
printf("a[%d][%d]=%d\n", i, j, *(*(a + i) + j));
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
printf("a[%d][%d]=%d\n", i, j,*(&a[0][0] + i * 2 + j));
}
}
return 0;
}
3. 指针式访问说明
对于指针式访问有两种写法,对应于数组地址+1
和 数组名+1
这两种关系。
对于数组名访问的方式:
- a+i 类型为
int (*)[2]
- *(a+i) 类型为
int *
- (*(a+i)+j) 类型为
int *
而使用数组地址访问,直接按照线性关系移动即可。