本文共 2168 字,大约阅读时间需要 7 分钟。
数组是含多个数据值的数据结构,并且每个数据值具有相同的数据类型,这些值称为元素,可以根据元素的位置把它们一个个选出来。
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
在 C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:
type arrayName [ arraySize ];
这叫做一维数组。arraySize必须是一个大于零的整数常量,type可以是任意有效的 C 数据类型。例如,要声明一个类型为 double 的包含 10 个元素的数组balance,声明语句如下:
double balance[10];
现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。
初始化数组:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
balance[4] = 50.0;
上述的语句把数组中第五个元素的值赋为 50.0。所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。这就是数组下标
当你想访问数组元素时可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。比如:
double salary = balance[9];
如果对数组使用sizeof运算符,则可以确定数组的大小,如果数组a有10个整数,那么sizeof(a)通常为40。假设整数占4个字节。
当然还可以通过sizeof来计算数组元素的大小。用数组的大小除以数组元素的大小可以得到数组的长度:
sizeof(a) / sizeof(a[0])
C 语言支持多维数组。多维数组声明的一般形式如下:
type name[size1][size2]...[sizeN];
例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组:
int threedim[5][10][4];
二维数组
多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:
type arrayName [ x ][ y ];
其中,type可以是任意有效的 C 数据类型,arrayName是一个有效的 C 标识符。一个二维数组可以被认为是一个带有 x 行和 y 列的表格。下面是一个二维数组,包含 3 行和 4 列:
int x[3][4];
因此,数组中的每个元素是使用形式为 a[ i , j ] 的元素名称来标识的,其中 a 是数组名称,i 和 j 是唯一标识 a 中每个元素的下标。
多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。
int a[3][4] = { {0, 1, 2, 3} , /* 初始化索引号为 0 的行 */ {4, 5, 6, 7} , /* 初始化索引号为 1 的行 */ {8, 9, 10, 11} /* 初始化索引号为 2 的行 */};
二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:
int val = a[2][3];假设以上面的数组为例输出结果是 11
所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最常见的错误之一。
C 语言中数组的大小必须在程序运行前就确定下来。但是它并不检验数组边界,数组的两端都有可能越界,从而使其他变量的数据甚至程序代码被破坏
数组下标取值越界
数组下标取值越界主要是指访问数组的时候,下标的取值不在已定义好的数组的取值范围内,而访问的是无法获取的内存地址。例如,对于数组 int a[3],它的下标取值范围是 [0,2](即 a[0]、a[1] 与 a[2])。如果我们的取值不在这个范围内(如 a[3]),就会发生越界错误。示例代码如下所示:
访问 a[3] 是非法的,将会发生越界错误。
代码示例:
一开始定义N为5个元素的数组,通过for循环去打印n[i],你会发现从下标5开始后面5个元素全部都是随机值。
因为C不报错,会继续打印后边的内存地址,如果后边的区域是不能访问的地方,就会被操作系统提示segment fault然后干掉程序,而越界的就是接下来内存里四个字节的内容。如果你通过数组名称,格式化输出选%p,打印数组开头的地址,一个int四个字节
这就是后面从下标5开始到下标9的内存地址。
所以数组下标的取值范围只能预先推断一个值来确定数组的维数。
转载地址:http://dmzsdu.baihongyu.com/