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],内存图如下

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

posted on 2016-08-16 16:33  奋斗中的码农  阅读(669)  评论(0编辑  收藏  举报

导航