学益得线上课堂
从基础学习嵌入式
玩转智能硬件、斩获高薪offer
可以把二维数组理解成特殊的一维数组。一维数组每个元素是整数(如果是整型数组的话),那么二维数组可以理解成也是一个一维数组,只不过每个元素又是一个一维数组。
int a[3][4];
a是二维数组名,3 和 4 分别表示行数和列数,int 说明 a 是整形数组,每个元素都是整数。
初始化有如下几个方法:
#include
int main()
{
int a[3][4]; //不初始化,每个元素都是垃圾值。
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; //初始化所有元素(不规范写法)
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; //初始化所有元素(规范写法)
int a[3][4] = {{1, 2}, {1}, {5, 6}}; //初始化部分元素,其他没有初始化的元素是0
int a[][4] = {{1, 2, 3, 4}, {2, 3, 4, 5}}; //行数可以省略
int a[3][4] = {0}; //所有元素初始化为0
//遍历二维数组,需要两层循环
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}
运行如下程序:
#include
int main()
{
int a[3][4] = {0};
printf("a : %p\n", a);
printf("a[0] : %p\n", &a);
printf("&a[0][0] : %p\n", &a[0][0]);
printf("&a : %p\n", &a);
printf("*************\n");
printf("a + 1 : %p\n", a + 1);
printf("a[0] + 1 : %p\n", a[0] + 1);
printf("&a[0][0] + 1 : %p\n", &a[0][0] + 1);
printf("&a + 1 : %p\n", &a + 1);
return 0;
}
运行结果:
a + 1 和 a 相距 16 个字节。程序中是 3 行 4 列的二维数组, 16 个字节正好是一行;
a[0] + 1 和 a[0] 相距 4 个字节,正好是一个整数的字节数;
&a[0][0] + 1 和 &a[0][0] 相距 4 个字节,是一个整数的长度;
&a + 1 和 &a 相距 48 字节,是一个数组的长度。
结论:
注:指向的内容不同,步长则不同,即加一增加的字节数不同。
题目:编写程序,打印菱形星号组合
#include
int main()
{
char point[9][9] = {0};
int x, y;
for (x = 0; x < 9; x++)
{
for (y = 0; y < 9; y++)
{
if (x <= 4 && y >= 4 && y - x == 4)
point[x][y] = 1;
else if (x >= 4 && y >= 4 && x + y == 12)
point[x][y] = 1;
else if (x <= 4 && y <= 4 && x + y == 4)
point[x][y] = 1;
else if (x >= 4 && y <= 4 && x - y == 4)
point[x][y] = 1;
}
}
for (x = 0; x < 9; x++)
{
for (y = 0; y < 9; y++)
{
if (point[x][y] != 0)
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
提示:把菱形放在坐标中,找到每个点横纵坐标的关系。
数组a[3][4],哪个不能表示a[1][1]的地址
分析:
a[1] 表示第 2 行首元素地址,指向一个元素,所以 a[1] + 1 可以表示 a[1][1] 地址;
B选项很显然,就是取 a[1][1] 地址;
*(a + 1) 等价于 a[1],后面指针会讲到。C 选项等价于 A选项;
a 表示数组首行地址,a + 5 指向数组的第 5 行,已经越界了,所以 D 错误。
更多视频、文章、嵌入式学习资源,微信关注 【学益得智能硬件】。