数组相关知识总结
数组是C语言中比较重要的一部分,在编程中会经常使用。数组是一组有序数据的集合,数组中的每一个元素都属于同一个数据类型,下表代表数据在数组中的位置。
一维数组
定义一维数组的一般形式为:
类型名 数组名[常量表达式];
eg:int arr[10];
在定义数组时,需要制定数组中元素的个数,方括号中的常量表达式用来表示数组的大小。(注意:方括号中必须为常量表达式,不能出现变量)
数组是使用下标来访问的,下标是从0开始
数组的大小可以通过计算得到(sizeof(arr)/sizeof(arr[0]))
随着数组下标的增长,元素的地址也在增长,数组在内存中是连续存放的。
在几乎所有使用数组名的情况下,数组名都表示一个指向数组第一个元素的地址的指针常量,如arr指的就是arr[0]的地址。在下面这两种情况中数组名代表整个数组,而不是数组首元素的地址。
- sizeof(数组名):数组名单独放在sizeof内部,表示整个数组,求取的是整个数组的大小,单位是字节
- &数组名:数组名表示整个数组,取出的是整个数组的地址
数组除了通过下标引用的方式访问数组元素外还可以通过间接访问来访问数组元素。举个例子:
int arr[10];
int *p = arr;
在进行指针加法运算是会进行调整,运算结果产生的指针p指向arr[0],对变量p解引用就可以得到arr[0]的值。
arr[2]\*(p+2)\p[2]\2[p]
上面这几个表达式是等价的,其结果都是arr[2]的值。
数组的初始化
数组初始化的方式取决于它们的存储类型,如果数组未被初始化,数组的元素会被置为0,但此时必须给定数组的大小,也就是方括号中的数在这种情况下不能省略。如果声明中未给定数组的大小,那么编译器就把数组的长度设置为刚好可以放下所有初始值的长度。
int arr1[10] = {1,2,3,4,5,6,7,8};
int arr2[] = {1,2,3,4,5};
如arr1的数组长度为10,初始化的元素有8个,那么arr[8],arr[9]就会被置为0;arr2给定5个初始化元素,编译器就将arr2的长度设置为5.
char arr[] = {'h','e','l','l','o',0};
char arr[] = "hello";
以上两种都是定义一个字符数组,显然第二种更为简单,这是c语言标准提供的一种快速初始化字符数组的方法。前者是初始化数组的每一个元素(要存储\0),后者是指针变量被初始化为一个字符串常量的首地址。
多维数组
如果一个数组的维数不止一维,那就称为多维数组,最常用的就是二维数组。一维数组名的值是一个指针常量,它的类型是“指向元素类型的指针”,它指向数组的第1个元素。多维数组也差不多,唯一的区别是多维数组第1维的元素实际上是另一个数组。多维数组在内存中也是连续存放的。
int arr[3][10];
定义了arr数组(二维数组),它可以看作是一个一维数组,包含3个元素,每个元素都是包含10个整型元素的数组。多维数组也可以通过下标引用和指针来访问数组元素。
注:二维数组中第一个方括号的值可以省略,但是第二个方括号的值不能省略。
数组的初始化
int arr[2][3] = {1,2,3,4,5,6};
int arr[2][3] = {{1,2,3},{4,5,6}};
这两种方式都可以用来初始化多维数组,第二种方式更为直观,便于阅读。
指针数组
指针变量和其它变量很相似,也可以创建一个指针数组。指针数组的元素都是指针。
int *arr[10];
arr的元素类型都为指向整型的指针。举个使用指针数组的例子。
char const arr[] = {"keyword", "return","for","while",NULL};
在末尾加一个空指针,可以使函数在搜索时能够检测到结束,并无需知道其长度。
警告
- 当访问多维数组的元素时,误用逗号分隔下标。
- 在一个指向未指定长度的数组的指针上执行指针运算。