• c++之 数组


    数组的定义

    数组用于表示一组数值,例如:

    char arr[5];
    

    其中,arr称为"数组变量",简称"数组"。它表示5个char型数据,我们把每一个数据称为一个"元素"。

    数组的定义中包含以下几个要求:

    • 元素类型:上例中元素类型为char
    • 元素的个数:中括号内指定个数,例如上面的数组长度为5
    • 数组的名称:上例中数组的名称为arr

    数组的意义是把N个同类型的变量排列在一起,比如对于char arr[5]就是说把5个char排名在一起

    定义基本类型的数组,例如:

    #include <stdio.h>
    
    int main() {
        
        char alpha[10];     // 10个char类型元素
        short years[20];    // 20个short类型元素
        int numbers[30];    // 30个int类型元素
        float scores[3];    // 3个float类型元素
        double values[12];  // 12个double类型元素
    
        return 0;
    }
    

    数组的命名

    • 数组的命令规则和变量名的规则相同,即"数字、字母、下划线的组合,但不能以数字开头
    • 首先,变量的名字要符合其意义,这要求我们在命名时要能做到"词能达义,顾名思义",不要给变量起一个不相关的名字
    • 其次,数组变量的名字一般使用小写字母,如果由多个单词组成,则中间以下划线分开

    注:你可以较为随意的定义一个变量名,但是这样"随意"地写代码,会使代码难以阅读,"可读性"降低,因此建议按照推荐的方式来给变量命名

    数组的长度必须是常量

    • 数组的长度在中括号内指定,必须是一个整型常量,例如:
    int arr[12];
    
    • 不能用变量来表示一个数组的长度,例如:
    // 下面的定义是错误的
    int size = 12;
    int arr[size];     // 编译器会报错,数组长度必须是常量
    

    数组的基本方法

    数组的初始值

    在定义数组的时候可以指定每一个元素的初始值,例如:

    char arr[5] = {90, 91, 92, 93, 94};
    

    其语法要素为:

    • 使用大括号,大括号末尾加上分号
    • 大括号内指定初始值,每个初始值以逗号隔开,但最后一个数组末尾不加逗号

    一些特殊的写法

    • 不指定初始值
    char arr[5];    // 定义了一个长度为5的char型数组,不指定初始值
    
    • 只指定一部分初始值
    char arr[5] = {90, 91};    // 只指定前2个元素的初始值
    注意:这种写法只能按顺序从前往后定义
    _
    如果在定义的时候只能给出后面的几个元素的值,则必须手动把前面的元素设置一个初始值,例如:
    char arr[5] = {0, 0, 0, 90, 91};    // 只知道后2个元素的值,就先把前三个用0来占位
    
    • 只有初始值,没有长度

    中括号的长度可以省略不写,当不写长度时,编译器会根据初始化列表中的元素的个数来计算其长度

    char arr[] = {90, 91, 92, 93};    // 中括号没有写明长度,编译计算得到其长度为4
    
    • 按位清零
    char arr[5] = 0;    // 则等于 char arr[5] = {0, 0, 0, 0, 0};
    

    访问数组元素

    利用数组名加中括号可以访问数组中的所有元素,中括号内的数值表示元素的位置(称为"下标"或"索引")。元素的下标从0开始计算,这意味着第一个元素使用value[0],第二个元素使用value[1] ... 以此类推

    例如,下面的代码用于对5个元素求和

    获取数组的大小

    数组的大小由元素的类型和元素的个数共同决定,例如:

    数组的内存视图

    每一个变量都会绑定一块内存区域,修改变量的值实质上就是修改对应内存的值,对于数组来说,它也是变量,而且相当于若干个基本变量排列在一起,那么数组在内存视图角度来看,是直接对应了若干个内存单元

    定义一个short

    #include <stdio.h>
    
    int main() {
    
        // 由于一个short类型占2个字节,所以4个short占8个字节的内存,在内存中,a[0],a[1],a[2],a[3]可以视为连续排列的8个short型变量
        short a[4] = { 0x1111, 0x2222, 0x3333, 0x4444 }; 
    
        return 0;
    }
    

    注:在VC的调试状态下的"内存"窗口中,可以直接观看数组a对应的内存,如下图所示,方框线内的8个字节就是数组a所占据的内存,其中 "11 11"是a[0], "22 22"是a[1], "33 33"是a[2], "44 44"是a[3],可以很直观的看到,它们是紧密排列的

    数组常见问题

    • 问题一:初始化列表的长度不能大于数组的长度
    #include <stdio.h>
    
    int main() {
    
        int values[5] = { 1, 2, 3, 4, 5, 6 };   // 这样写是错的,初始化列表的长度不能大于数组长度
    
        return 0;
    }
    
    • 问题二:越界访问
    #include <stdio.h>
    
    int main() {
    
        int values[5] = { 1, 2, 3, 4, 5 };
    
        values[5] = 123;    // 越界了
    
        // 上面的代码编译器检查不出来,运行的时候会报错
    
        return 0;
    }
    
    • 问题三:只有在初始化的时候才可以用初始值列表
    #include <stdio.h>
    
    int main() {
    
        // 这样写是对的
        int arry[4] = { 1, 2, 3, 4 };
    
        // 这样写是错的
        // int arry[4];
        // arry = { 1, 2, 3, 4 };
    
        //只能够对单个元素赋值
        arry[0] = 1;
        arry[1] = 2;
        arry[2] = 3;
        arry[3] = 4;
    
        return 0;
    }
    

    多维数组

    1、二维数组的定义

    type name[N1][N2],其中,type是元素类型,name是数组变量的名称,N1是第一维的大小,N2是第二维的大小

    可以用行和列的概念来理解二维数组,第一个下标是行号,第二个下标是列号,例如:

    // 创建一个4*3的表格,其下标依次是
    a[0][0]    a[0][1]    a[0][2]
    a[1][0]    a[1][1]    a[1][2]
    a[2][0]    a[2][1]    a[2][2]
    a[3][0]    a[3][1]    a[3][2]
    

    至于3维数组、4维数组以至于N维数组,都可以用类似的方法得到,高维数组不常用

    2、二维数组的初始化

    二维数组和一维数组的初始化方法类似,都是用大括号初始化,由于是二维,所以需要用两层大括号来分别初始化每一行

    例:对一个4行3列的数组进行初始化

    #include <stdio.h>
    
    int main(){
    
        int a[4][3] = 
        {
            { 11, 12, 13 },
            { 21, 22, 23 },
            { 31, 32, 33 },
            { 41, 42, 43 },
        }
        
    }
    

    3、二维数组的本质

    二维数组、三维数组、四维等高维数组,只是在形式上比一维数组更直观更容易操作,其本质仍然是一维数组,可以从内存中看出这个结论

    比如:对于int a[4][3],在内存中对应连续的12个int:a[0][0],a[0][1],a[0][2],a[0][3]...a[4][3],内存图如下

    注:实际上,二维数组在内存中还是以一维数组的形式存在的,只不过是编译器帮忙把咱们能看的懂得二维数组转换成了一维数组

  • 相关阅读:
    位运算
    LeetCode(230):二叉树中的第K小元素
    LeetCode(69):二分法求平方根
    TCP如何保证传输可靠性
    2种方法(递归+BFS)求二叉树的最小/最大深度
    自动生成Mapper文件(基于Mybatis Maven插件)
    Git的使用
    Java关键字及其作用详解
    Vagrant安装Centos/7
    java servlet 几种页面跳转的方法及传值
  • 原文地址:https://www.cnblogs.com/CongZhang/p/5776868.html
Copyright © 2020-2023  润新知