数组的概念
由一系列数据类型相同的元素组成的有序集合。如何去理解呢?
以一个鞋架为例,这个鞋架一共五层,每层最多放三双鞋。类比为数组则是,数组“鞋架”一共有五个元素(每一层视为一个元素),每个元素的值为“最多三双鞋”(每一层可以放0-3双鞋子)。
数组的类型
//基本类型
/*整型数组*/
int array[5] = {0, 1, 2, 3, 4};
/*浮点型数组*/
float array[5] = {0.5f, 0.6f, 0.7f, 0.8f, 0.9f};//单精度
double array[5] = {0.5, 0.6, 0.7, 0.8, 0.9};//双精度
/*字符型数组*/
char str[5] = {'a', 'b', 'c', 'd', 'e'};
数组的初始化
以整型数组为例
#include <stdio.h>
int main()
{
int array[3] = {1, 2, 3};//列表初始化
/******************************/
int array2[3] = {0};//全部元素初始化为0
/******************************/
int array3[3];
array3[0] = 0;
array3[1] = 1;
array3[2] = 2;
/******************************/
int array4[3] = {1};//列表初始化一个元素,其余元素被置0
return 0;
}
数组的访问
结合上图与例子,数组array的元素个数一共有五个,首个元素为array[0],这里面’0’叫做数组下标,其计数从0开始,访问方式为’[]’。
补充1
C 不允许把数组作为一个单元赋给另一个数组,除初始化以外也不允许使用花括号列表的形式赋值。
/* 一些无效的数组赋值 */
#include <stdio.h>
#define SIZE 5
int main(void)
{
int arr[SIZE] = {5,3,2,8}; /* 初始化没问题 */
int arr2[SIZE];
arr2 = arr; /* 不允许 */
arr2[SIZE] = arr[SIZE]; /* 数组下标越界 */
arr2[SIZE] = {5,3,2,8}; /* 不起作用 */
/*arr数组的最后一个元素是arr[SIZE-1],所以arr[SIZE]和arr2[SIZE]都超出了两个数组的末尾。*/
return 0;
}
补充1中涉及到一个数组边界的问题。一个数组arr[5],其大小为5,但是在进行访问过程中,元素arr[5]则已经不属于arr这个数组了,因为下标5已经超过arr的有效范围了。其值是一个随机值(也叫垃圾值)。
在声明一个数组的过程中,int array[5]; 这个数组大小确定为5,数组访问下标是从0开始,那么最后一个数组元素对应的下标应该是4,即数组下标最大值应该是数组大小减去1.