【嵌入式修炼之路】- C语言第五课之二维数组

学益得线上课堂
从基础学习嵌入式
玩转智能硬件、斩获高薪offer

二维数组定义

可以把二维数组理解成特殊的一维数组。一维数组每个元素是整数(如果是整型数组的话),那么二维数组可以理解成也是一个一维数组,只不过每个元素又是一个一维数组。

【嵌入式修炼之路】- C语言第五课之二维数组_第1张图片二维数组既有行又有列,所以需要两个下标表示,定义如下:

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;
}

运行结果:

【嵌入式修炼之路】- C语言第五课之二维数组_第2张图片分析:

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 字节,是一个数组的长度。

结论:

  • 二维数组名 a 是数组首行地址,指向的是一行元素;
  • a[0] 表示数组第一行首元素地址,指向的是一个元素;
  • &a 表示数组的地址,指向的是整个数组。

注:指向的内容不同,步长则不同,即加一增加的字节数不同。

打印菱形

题目:编写程序,打印菱形星号组合

【嵌入式修炼之路】- C语言第五课之二维数组_第3张图片

#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 a[1] + 1
  • B &a[1][1]
  • C (*(a + 1)) +1
  • D a+5

分析:

a[1] 表示第 2 行首元素地址,指向一个元素,所以 a[1] + 1 可以表示 a[1][1] 地址;

B选项很显然,就是取 a[1][1] 地址;

*(a + 1) 等价于 a[1],后面指针会讲到。C 选项等价于 A选项;

a 表示数组首行地址,a + 5 指向数组的第 5 行,已经越界了,所以 D 错误。

更多视频、文章、嵌入式学习资源,微信关注 【学益得智能硬件】。

【嵌入式修炼之路】- C语言第五课之二维数组_第4张图片

你可能感兴趣的:(C语言)