【学习C语言的第二天】

数组

  • Array数组是有限的有序元素集合

  • 数组元素的顺序集合

  • 一个数组中所有元素的类型是相同的

  • 数组的长度即数组元素的个数

  • 数组中的元素通过下标来进行访问的

一维数组
定义
Type ArrayName[ARR_LEN];
  • sizeof(ArrayName)/sizeof(ArrayName[0]) 得到数组的 长度
  • ARR_LEN 即数组长度 元素的个数 变量的个数

    • 必须是非负整数

    • 如果ARR_LEN是整型常量表达式,则可以直接初始化

    • 如果ARR_LEN不是常量,则不能直接初始化( = {})

      • 称为 可变长数组

        • 可变长数组不是指数组长度可以变化 ,而是指定义该数组中,数组长度是一个整型表达式(非常量)

      • 可变长数组不能在全局作用域中定义,可变长数组也不能声明为static

    • 如果在定义数组中ARR_LEN不指明,则必须直接初始化

      int arr[] = {1,2,3,4,5};
      • 数组的长度取决于初始化器{}中元素的个数

    • 数组一旦定义,数组长度不可以改变

初始化
  • 初始化器{元素,元素,...}

    int arr[5] = {1,2,3,4,5};
    int brr[5] = {1,2,3,4,5,6};        //编译警告
    int crr[5] = {1,2};                //后面补0
    int drr[5] = {0};                  //全部为0
    int err[5] = {};                   //全部为0
    int frr[5] = {[2]=1,[4]=2};        //指定初始化 其余0
    int grr[] = {1,2,3,4};
    int n = 0;
    scanf("%d",&n);
    int hrr[n]; 
    ​
    void func(int n){
        int arr[n];
    }
数组元素访问
  • 数组中的元素是通过下标访问的

    ArrayName[index]
    
  • 通过下标,可以访问数组中的元素,也可以修改数组中的元素的值

  • 下标运算符[],本质是指针偏移解引用

    ArrayName[index]         ===     index[ArrayName]
    *(ArrayName + index)
  • index下标从0开始,到 ARR_LEN -1 (数组长度-1)

    • 如果超过[0,ARR_LEN-1] 范围,则数组越界访问,非常危险的

  • 一维数组作为参数传递

    void func(int arr[],int len){  //(int *arr,int len)
        
    }
    int arr[10];
    func(arr,10);  //传递数组名和数组长度
再议数组名
  • 数组名是常量,

  • 通过sizeof(数组名) == 得到数组内存大小

  • 数组名 内存地址

    &arr[0]          数组第一个元素的内存地址   首元素内存地址
    &*(arr + 0)     ==    &*arr     ==    arr
    • 数组名即数组首元素内存地址

    • 在调用函数把数组名作为实参传递时,事实上传递了 &arr[0]数组第一个元素的内存地址

    • 所以,在形参列表中的 数组,本质就完全退化为指针,这个时候sizeof(形参数组) == sizeof(指针)

  • 数组名 以及 对数组名取址

    &arr[0]
    arr
    &arr
    ​
    以上三个值相等,区别在于类型不相等
        &arr[0]和arr  类型为      TYPE *
        &arr          类型为      TYPE (*)[ARR_LEN]
        
    &arr[0]+1   和 arr+1     实际 + sizeof(TYPE)
    &arr+1                   实际 + sizeof(arr)
二维数组
  • 二维数组可以理解为行列矩阵,但实际上二维数组依然是连续的有序元素集合

  • 二维数组 本质上 是一维数组 ,只是一维数组中的元素是 一维数组

定义
TYPE ArrayName[ARR_LEN1][ARR_LEN2];
​
ARR_LEN1   即二维数组中的长度             行
ARR_LEN2   即二维数组中元素(一维数组)的长度 列
初始化
int arr[4][5] = {{1,1,1,1,1},{2,2,2,2,2},{3,3},{4,4}};
int brr[3][4] = {1,2,3,4,5,6};
int brr[4][5] = {[1] = {1,2,3,4},[2][3]=1,[3][0]=5};
​
int crr[][3] = {1,2,3,4,5,6,7};  //3
int drr[][3] = {{},{1,2},{1},{}}; //4
  • 二维数组在定义时,一维长度不能省

  • 二维数组的二维长度 = sizeof(ArrayName)/sizeof(ArrayName[0])

  • 二维数组的一维长度 = sizeof(ArrayName[0])/sizeof(ArrayName[0] [0])

二维数组中元素的访问
  • 通过两个下标进行访问

    ArrayName[二维下标][一维下标]
    ArrayName[行][列]
    ​
    int arr[4][5] = {};
    int ret = arr[1][7];   //数组有越界吗?没有越界
    ​
  • 二维数组作为参数传递

    void func(int (*arr)[10],int len){
        
    }
    ​
    void goo(int (*arr)[],int row,int col){
        int (*brr)[col] = arr;//这样才能用
    }
    int arr[5][10];
    func(arr,5);
    int brr[6][8];
    ​
    goo(arr,5,10);
    goo(brr,6,8);
  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值