数组(二)

数组(二)

1、二维数组的定义

  • 定义方式:(声明时列数不能省略,行数可以省略

    数据类型 数组名[常量表达式] [常量表达式];

    如:int a[3] [4];3行4列

    元素个数=行数*列数

  • 数组元素的存放顺序

    • 原因:内存是一维的

    • 二维数组:按行序优先
      请添加图片描述

2、二维数组的理解

  • 二维数组a是由3个元素组成,每个元素a[i]由包含4个元素的一组数组组成。

  • 二维数组可以认为是由多个一维数组构成
    请添加图片描述

  • 实例:

    数组遍历输出,取地址

    #include <stdio.h>
    
    int main()
    {
        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));//数组名为内存首地址,sizeof(数组名)是数组占用的总内存空间
        printf("%p %d\n", a[0], sizeof(a[0]));
        printf("%p %d\n", a[1], sizeof(a[1]));
    		//a[1][0]的地址接在a[0][3]的后面
        return 0;
    }
    

    运行结果:

    array$ ./arr
    0x7ffeaaecd190 0x7ffeaaecd194 0x7ffeaaecd198 
    0x7ffeaaecd19c 0x7ffeaaecd1a0 0x7ffeaaecd1a4
    0x7ffeaaecd190 24
    0x7ffeaaecd190 12
    0x7ffeaaecd19c 12  
    

3、二维数组元素的引用

  • 形式:数组名[下标] [下标]

  • 二维数组元素的初始化

    • 分行初始化

    • 按元素排列顺序初始化

    • 几种初始化如下

    请添加图片描述

    • 实例如下

      全部初始化

      #include <stdio.h>
      
      int main()
      {
          int a[2][3] = {{1,6,9},{2,5,8}};
          int i, j;
      
          for(i = 0; i < 2; i++){
              for(j = 0; j < 3; j++)
                  printf("%d ", a[i][j]);
              putchar('\n');  
          }   
      
          return 0;
      }
      

      运行结果:

      array$ ./app
      1 6 9 
      2 5 8 
      

      部分初始化

      #include <stdio.h>
      
      int main()
      {
          int a[2][3] = {{1,6},{2}};
          int i, j;
      
          for(i = 0; i < 2; i++){
              for(j = 0; j < 3; j++)
                  printf("%d ", a[i][j]);
              putchar('\n');  
          }   
      
          return 0;
      }
      

      运行结果:

      array$ ./app
      1 6 0 
      2 0 0 
      

      第一维长度省略初始化

      #include <stdio.h>
      
      int main()
      {
          int a[][3] = {{1,2,3},{4}};
          int i, j;
      
          for(i = 0; i < 2; i++){
              for(j = 0; j < 3; j++)
                  printf("%d ", a[i][j]);
              putchar('\n');
          }
      
          return 0;
      }
      

      运行结果:

      array$ ./app
      1 2 3 
      4 0 0 
      

      行列部分初始化

      #include <stdio.h>
      
      int main()
      {
          int a[2][3] = {{1,2}};
          int i, j;
      
          for(i = 0; i < 2; i++){
              for(j = 0; j < 3; j++)
                  printf("%d ", a[i][j]);
              putchar('\n');
          }
      
          return 0;
      }
      

      运行结果:

      array$ ./app
      1 2 0 
      0 0 0 
      

      3*3数组

      #include <stdio.h>
      
      int main()
      {
          int a[3][3] = {{1},{2,3},{4}};
          int i, j;
      
          for(i = 0; i < 3; i++){
              for(j = 0; j < 3; j++)
                  printf("%d ", a[i][j]);
              putchar('\n');
          }
      
          return 0;
      }
      

      运行结果:

      /array$ ./app
      1 0 0 
      2 3 0 
      4 0 0 
      

      初始化省略列

      #include <stdio.h>
      
      int main()
      {
          int a[3][] = {{1},{2,3},{4}};
          int i, j;
      
          for(i = 0; i < 3; i++){
              for(j = 0; j < 3; j++)
                  printf("%d ", a[i][j]);
              putchar('\n');
          }
      
          return 0;
      }
      

      运行结果:错误,数组类型不完整

       error: array type has incomplete element type ‘int[]int a[3][] = {{1},{2,3},{4}};
      

4、程序举例

​ 打印杨辉三角的前十行。

  • 思考:1.打印出正方形;2.调整打印出下三角;3.调整值

    #include <stdio.h>
    
    int main()
    {
        int a[10][10] = {{0}};
        int i, j;
    
        for(i = 0; i < 10; i++){
            a[i][0] = 1;
            for(j = 1; j <= i; j++)
                a[i][j] = a[i-1][j-1] + a[i-1][j];
        }   
    
        for(i = 0; i < 10; i++){
            for(j = 0; j <= i; j++)
                printf("%-4d ", a[i][j]);
            putchar('\n');
        }   
    
        return 0;
    }
    

    运行结果:

    array$ ./app
    1    
    1    1    
    1    2    1    
    1    3    3    1    
    1    4    6    4    1    
    1    5    10   10   5    1    
    1    6    15   20   15   6    1    
    1    7    21   35   35   21   7    1    
    1    8    28   56   70   56   28   8    1    
    1    9    36   84   126  126  84   36   9    1   
    

5、总结与思考

​ 主要讲解了二维数组的用法,包括二维数组的定义,引用,初始化,存储等。

  • 思考:有一个3*4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。

    #include <stdio.h>
    
    int main()
    {
        int a[3][4] = {{2,5,8,9},{22,25,28,27},{5,6,8,35}};
        int i, j;
        int row, column;
    
        row = column = 0;
    
        for(i = 0; i < 3; i++){
            for(j = 0; j < 4; j++){
                if(a[row][column] < a[i][j]){
                    row = i;
                    column = j;
                }
    
            }
    
        }
    
        for(i = 0; i < 3; i++){
            for(j = 0; j < 4; j++)
                printf("%d ", a[i][j]);
            putchar('\n');
        }
    
        printf("max =  %d  row = %d  column = %d\n", a[row][column], row, column);
    
        return 0;
    }
    

    ​ 运行结果:

    array$ ./app
    2 5 8 9 
    22 25 28 27 
    5 6 8 35 
    max =  35  row = 2  column = 3
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值