数组的定义

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

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

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

c++之 数组的更多相关文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

  4. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  5. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

  6. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  7. js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的

    题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...

  8. javascript数组查重方法总结

    文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...

  9. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

  10. 小兔JS教程(四)-- 彻底攻略JS数组

    在开始本章之前,先给出上一节的答案,参考答案地址: http://www.xiaotublog.com/demo.html?path=homework/03/index2 1.JS数组的三大特性 在J ...

随机推荐

  1. java动态代理和cglib动态代理

    动态代理应用广泛,Spring,Struts等框架很多功能是通过动态代理,或者进一步封装来实现的. 常见的动态代理模式实现有Java API提供的动态代理和第三方开源类库CGLIB动态代理. Java ...

  2. WAS集群系列(6):集群搭建:步骤4:安装WAS升级软件

    逐步点击"下一步",注意一处流程,例如以下列举: "升级软件"安装的路径设置,建议与之前的WAS及IHS安装的绝对路径同样,例如以下所看到的: 逐步点击,完毕安 ...

  3. LR翻页脚本并在每页实现业务操作

    性能需求:在列表中删除后有记录,或对列表中的每条记录进行操作(如点击每条记录的“单号”进入订单详情页面,或在列表中对每条记录进行“启用”.“停止”操作) 举例:Vuser脚本模拟用户在订单列表中点击每 ...

  4. FineUI上传控件

    文件上传 现在就简单多了,并且也漂亮多了,参考这个示例. 1: <ext:SimpleForm ID="SimpleForm1" BodyPadding="5px& ...

  5. Lanucherr 默认显示第几屏

    Launcher.java static final int SCREEN_COUNT = 5;static final int DEFAULT_SCREEN = 2;//第一页是从0开始计数,这里是 ...

  6. Private Members in JavaScript

    Private Members in JavaScript Douglas Crockford www.crockford.com JavaScript is the world's most mis ...

  7. Lucene文件扩展名

    名称 文件后缀 描述 段文件(Segments File) segments.gen segments_N 存储提交点信息 锁文件(Lock File) write.lock 用来阻止多个indexW ...

  8. C/C++中的sizeof

    代码: #include <iostream> #include <string> using namespace std; int main(){ char s1[]=&qu ...

  9. 洛谷 P1896 互不侵犯King

    P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...

  10. www

    dddd int vec_rotate(char *vec,int rotdist, int length) { int i,j,k,times; char t; times = gcd(rotdis ...