C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
1 | int a[2] = {1,2}; |
(a+i)
就代表的是 a[0+i]
的地址。
声明数组
C 中要声明一个数组,需要指定元素的类型和元素的数量:
一维数组
1 | type arrayName [ arraySize ]; |
arraySize
必须是一个大于零的整数常量,type
可以是任意有效的 C 数据类型。
初始化数组
在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
1 | double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0}; |
大括号 {}
之间的值的数目不能大于在数组声明时在方括号 []
中指定的元素数目。
所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。
可以只给部分元素赋值,当 {}
中值的个数少于元素个数时,只给前面部分元素赋值。例如:
1 | int a[10]={12, 19, 22 , 993, 344}; |
表示只给 a[0]~a[4]
5 个元素赋值,而后面 5 个元素自动初始化为 0。
当赋值的元素少于数组总体元素的时候,不同类型剩余的元素自动初始化值说明如下:
- 对于
short、int、long
,就是整数0
; - 对于
char
,就是字符\0
; - 对于
float、double
,就是小数0.0
。
可以通过下面的形式将数组的所有元素初始化为 0:
1 | int nums[10] = {0}; |
由于剩余的元素会自动初始化为 0,所以只需要给第 0 个元素赋值为 0 即可。
- 只能给元素逐个赋值,不能给数组整体赋值。例如给 10 个元素全部赋值为 1,只能写作:
1 | int a[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; |
而不能写作:
1 | int a[10] = 1; |
访问数组元素
数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:
1 | double salary = balance[9]; |
1 |
|
指针与数组名的区别
- 指针:也是一个变量,存储的数据是地址。
- 数组名:代表的是该数组最开始的一个元素的地址。
实际上数组是 const
的指针,所以不能被赋值。 如果 int a[] = {1,2,5,7}; int b[]
,由于 int b[]
实质上等价于 int const *b
;
b 是一个常数,不能被改变,初始化出来代表这个数组就不能再改变。 b = a;
(错误) 数组变量之间是不可以这样互相赋值的。 而 int *q = a;
这样是可以的。
1 | int a[10]; |
1,对数组元素 a[i]
的引用也可以写成 *(a+i)
这种形式。
2,赋值语句 p=&a[0]
也可以写成下列形式: p=a
。
3,p 是个指针,p[i]
与 *(p+i)
是等价的。
区别:指针是一个变量,可以进行数值运算。数组名不是变量,不可以进行数值运算。
字符数组与字符串
1 | char *str="Hello"; |
字符数组:
1 | char *p=(char*)&arrgs == char *p=arrgs ; |
字符串指针:
1 | char *p=(char*)&str != str; str==str[0] =='H' |
字符数组的首地址可以用 arrgs
,&arrgs
,来表示并且它们相等,但是指针&str
和str
是不同的。