zoukankan      html  css  js  c++  java
  • C语言——二维数组

    二维数组

    一、二维数组的定义

    类型名  数组名[ 常量表达式1 ][ 常量表达式2 ]
    int a[2][2]
    

    二维数组可以看成是矩阵(或表格),常量表达式1可以看成矩阵(表格)的行数,常量表达式2可以看成矩阵(表格)的列数。

    二维数组可以看成一个一维数组a[0],a[1],数组中的元素又是一个个一维数组a[0][0],a[0][1]和a[1][0],a[1][1]

    在内存中,二维数组站一系列连续的存储单元。存放的顺序是“ 按行存放

    二、二维数组的初始化

    1、赋初值个数与数组元素个数相同

    int a[4][3] = {{1,2,3},{1,2,3},{1,2,3},{1,2,3}}
    

    2、一行所赋初值个数与数组每行元素不同

    系统自动给该行后面的元素补充初值0,但是不能跳过每行前面的元素给后面的元素赋初值

    int a[4][3] = {{1,2,3},{1},{1,3},{1}}
    // 等价于
    int a[4][3] = {{1,2,3},{1,0,0},{1,3,0},{1,0,0}}
    

    3、赋初值行数少于数组的行数

    系统自动给不足行赋初值0

    int a[4][3] = {{1,2,3},{1}}
    // 等价于
    int a[4][3] = {{1,2,3},{1,0,0},{0,0,0},{0,0,0}}
    

    4、赋初值时省略花括号

    系统按照元素在内存中排列的顺序,将{}中的元素一一对应地赋给各个元素,若数据不足,后面的元素自动赋初值0

    int a[4][3] = {1,2,3,4,5,6,7}
    // 等价于
    int a[4][3] = {{1,2,3},{4,5,6},{7,0,0},{0,0,0}}
    

    三、通过赋初值定义二维数组的大小

    在一维数组中可以省略常量表达式,通过赋初值个数来确定数组的大小。

    ==> 二维数组也可以省略常量表达式,但是 只能省略常量表达式1

    int a[][3] = {{1,2,3},{1},{2,3}}
    // 等价于
    int a[3][3] = {{1,2,3},{1},{2,3}}
    
    int a[][3] = {1,2,3,4,5,6,7}
    // 等价于
    int a[3][3] = {{1,2,3},{4,5,6},{7,0,0}}
    

    四、二维数组与指针

    1、二维数组的名字

    ​ 在二维数组中,数组名也是一个存放地址的指针,它的值是二维数组中第一个元素的地址。a与a[0]的值相 同,a+1与a[1]的值相同,a+2与a[2]的值相同,他们分别表示第一行、第二行、第三行的首地址。

    ​ ===> 二维数组的名字是一个行指针,表示一行的首地址

    2、二维数组元素的地址

    // 三种方式等价
    &a[i][j]
    a[i]+j
    *(a+i)+j
    

    3、引用二维数组元素

    • 通过地址引用二维数组元素
    int a[3][4]
    
    a[i][j]  <==>  *(a[i]+j)  <==>  *(*(a+i)+j)
    
    • 通过建立指针数组引用二维数组元素
    int *p[3],a[3][2]
    
    *(p[i]+j)  <==>  *(*(p+i)+j)  <==>  (*(p+i))[j]  <==> p[i][j]
    
    • 通过建立一个行指针引用二维数组元素
    int a[3][2],(*p)[2]
    
    p[i][j]  <==>  *(p[i]+j)  <==>  *(*(p+i)+j)  <==>  (*(p+i))[j]
    

    4、二维数组名与指针数组作为实参

    • 二维数组名作为实参

      当二维数组名作为实参时,形参必须是一个行指针变量

    main(){
        int s[M][N];
        fun(s);
    }
    
    // 形参的三种书写形式
    fun(int (*a)[N])
    fun(int a[][N])
    fun(int a[M][N])
    
    • 指针数组作为实参
      当指针数组名作为实参时,形参必须是一个指向指针的指针
    main(){
        int s[M][N], *ps[M];
        for(int i=0;i<M;i++)ps[i]=s[i];
        func(ps)
    }
    
    // 形参的三种书写形式
    func(int *a[M])
    func(int *a[])
    func(int **a)
    
  • 相关阅读:
    获取DataGrid数据
    C# 分頁
    TCP 协议
    node fs对象
    ANSI转义码 改变输出的字体颜色
    异步流程控制模式
    node event对象
    js中的异常捕获 try{} catch{}(二)
    node require 文件查找的顺序
    node process全局对象
  • 原文地址:https://www.cnblogs.com/linagcheng/p/9879110.html
Copyright © 2011-2022 走看看