为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第2天【养成记】嵌入式挑战第2天,C语言中的二维数组、C语言中的二维数组代码实战

标签:
嵌入式

课程章节:

  • 课程名称:物联网/嵌入式工程师
  • 章节名称:第2周之第三讲 1-6 至 1-7 C语言中的二维数组、C语言中的二维数组代码实战
  • 讲师姓名:大白老师

课程内容:

C语言中的二维数组

二维数组

含义

一维数组是相同数据类型元素的集合,但是只能表示一行数据。 若是存在行和列相关的信息(例如矩阵),我们就需要用二位数组来表示。

定义方式

数据类型 数组名[行数][列数];

示例用法:

int a[3][4];  //三行四列

在内存中按照还是按照一维数组的顺序排序的。
只不过,为了方便人们识别,我们是按照二维的来理解。

0xd10     1     a[0][0]
0xd14     2     a[0][1] 
0xd18     3     a[0][2]
0xd1c     4     a[0][3] 
0xd20     5     a[1][0]
0xd24     6     a[1][1] 
0xd28     7     a[1][2]
0xd2c     8     a[1][3] 
0xd30     9     a[2][0]
0xd34     10    a[2][1] 
0xd38     11    a[2][2]
0xd3c     12    a[2][3] 

//int a[5]  int [5]

实际我们这里来写 int a[3][4];  //int a[3][4]
                   0         1           2          3
           0    a[0][0]    a[0][1]    a[0][2]    a[0][3]
           1    a[1][0]    a[1][1]    a[1][2]    a[1][3]
           2    a[2][0]    a[2][1]    a[2][2]    a[2][3]

结论

int  a[3][2];


[1]a的类型:   int [3][2]
[2]元素的表达方式:a[0][0],a[0][1],a[0][2] ...a[2][3]
[3]元素的个数:   行数 * 列数
[4]数组的大小:  元素的个数 * 一个元素的大小<===>6 * sizeof(a[0][0])<==>sizeof(a)
[5]数组最后一个元素:  a[行数 - 1][列数 - 1]
[6]内存的存放方式:按行优先存放.
[7]定义二维数组的时候,行数可以省略不写,系统会根据默认
    初始化元素的个数来分配对应的内存空间。但是列数一定要写。
        (因为二维数组默认按行来进行优先存放的)
        
   例如: 
     int a[3][4];  //true 
     int a[][4] = {1,2,3,4,5,6,7,8}; //true 
   //int a[3][] = {1,2,3,4,5,6,7,8,9}; //flase        
   //    123       1 2 3 4                  
   //    567       5 6 7 8 
   //    789       9 0 0 0   //都是3行,有多种排列方式,系统不能识别。
   //  int a[][] = {1,2,3,4,5,6,7,8}; //flase      

代码示例

#include <stdio.h>

int main()
{
    int a[3][2];
    int i = 0,j = 0;
/*
    scanf("%d",&a[0][0]);
    scanf("%d",&a[0][1]);
    scanf("%d",&a[1][0]);
    scanf("%d",&a[1][1]);
    scanf("%d",&a[2][0]);
    scanf("%d",&a[2][1]);
*/
    printf("please input %d data : ",3 * 2);

    for(i = 0;i < 3;i++) //0,1,2
    {
        for(j = 0;j < 2;j++)//0,1
        {
            scanf("%d",&a[i][j]);        
        }
    }

    for(i = 0;i < 3;i++) //0,1,2
    {
        for(j = 0;j < 2;j++)//0,1
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

二数组的初始化

完全初始化

int a[3][3] = {1,2,3,4,5,6,7,8,9};
int b[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

部分初始化

int a[][3] = {1,2,3,4,5,6};  //true
//int a[3][] = {1,2,3,4,5,6}; //false

代码示例:

#include <stdio.h>

// a[0][0] a[0][1]
// a[1][0] a[1][1]
// a[2][0] a[2][1]
int main()
{
    int a[3][2] = {{1,2},{3},{5,6}};
    int i = 0,j = 0;

    printf("please ouput %d data : \n",3 * 2);

    for(i = 0;i < 3;i++)
    {
        for(j = 0;j < 2;j++)        
        {
            printf("%d ",a[i][j]);        
        }
        printf("\n");
    }
    return 0;
}

学习笔记:

课后练习

练习

定义一个int a[10][10]的数组,利用二维数组输出下列杨辉三角的图案.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
...

代码:

#include <stdio.h>
#define M 10 // 行数

int main()
{
    int a[10][10];

    for (int i = 0; i < M; i++)
    {
        // 放中间 计算空格,以2个为一个单位
        for (int j = 0;j <= M - i; j++)
        {
            printf ("  ");
        } 
        for (int j = 0; j <= i; j++)
        {
            // 不是首尾的数 = 上一行的数 + 上一行的上一列的数
            a[i][j] = (i == j || j == 0) ? 1 : a[i - 1][j] + a[i - 1][j - 1]; //使用上一行计算
            printf("%4d", a[i][j]); 
        }
        printf("\n");
    }

    // 倒序 最后一行不要
    for(int i = M-2; i >= 0; i--)
    {
        for (int j = 0;j <= M - i; j++)
        {
            printf("  ");
        } 
        for (int j = 0;j <= i; j++)
        {
            printf("%4d",a[i][j]);
        } 
        printf("\n");
    }

    return 0;
}

课程评价:

通过对知识的梳理,熟练掌握二维数组的定义。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消