一、数组
1.什么是数组
通俗的说,数组就是一个容器,它可以存放其他类型的多个数据。
其特点有:
- 一个数组中所有元素数据类型相同;
- 一旦创建,大小就不能被改变;
- 一个数组里的各个元素在内存中都是顺序紧密排列的;
2.如何定义数组
(1)定义格式
类型 变量名 [元素数];
(2)例子
int a[5];
这行代码定义一个可以存储int类型数据的数组,数组名叫a,里面有5个单元,每个单元存储一个int型数据,每个单元存储一个元素。元素名分别叫做:
a[0],a[1],a[2],a[3],a[4]
这个数组的第一个元素是a[0],最后一个是a[4],没有a[5]。
因此,如果定义一个可以存储n个数据的数组b,那么数组b里的元素是n个,但是数组里面的元素是从b[0]开始,到b[n-1],没有b[n];
(3)注意
特别强调的是,数组一旦创建,大小就是你定义时的大小,之后就改变不了了。
3.初始化数组
(1)第一种方式
最常规的,定义的时候没有初始化,而是到后面在给每个数组元素赋值。如下:
#include <stdio.h>
int main()
{
int a[5];
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
a[4] = 5;
printf("%d %d %d %d %d",a[0],a[1],a[2],a[3],a[4],a[5]);
return 0;
}
输出结果:1 2 3 4 5
(2)第二种方式
集成初始化,直接用大括号给出数组所有元素的值,大括号中的每个元素用逗号分隔。不需要给出数组的大小,编译器帮你数。如下:
int a[] = {1,2,3,4,5};
上面代码就是默认按索引顺序赋值,即把1赋给a[0],把2赋给a[1]。。。
即a[0] =1,a[1] = 2,…a[4] = 5;
如果给了数组大小,但只给了部分元素的初值,则其他未初始化的元素为0;
int a[10] = {1};
这样初始化数组,只有a[0] = 1;其他所有数组元素为0。
(3)第三种方式
这种方式只可以在C99中能用。即定位初始化,如下
int a[10] = {[0] = 3,[2] = 4,6};
- 用[n]在初始化数据中给出定位
- 没有定位的位置的数据接在前面位置的后面
- 特别适合初始数据系数的数组
- 也可以不给出数组大小,让编译器算
(4)注意
- 数组变量本身不能被赋值;错误代码示范:
int b[] = a;
- 数组元素在没有赋值之前不可以被做右值。否则会出现想不到的错误。(详情请看mooc翁恺老师的数组相关章节)
- 数组定义时[]里面可以是变量(C99即之后),但是不可以用第三种方式初始化,因为编译器并不知道总长度的大小,而给未赋值的位置赋0;,下面是错误示范。
#include <stdio.h>
void main()
{
int n;
scanf("%d",&n);
int a[n] = {0};
}
4.遍历数组
5.数组的大小
sizeof(a)/sizeof(a[0])
- 这样的代码,一旦修改数组中的初始数据,不需要修改遍历的代码。
总结
上述只是简单介绍了一维数组的定义、初始化、遍历等操作及注意事项。数组不只有一维的,还有二维,三维…n维。更多介绍请自行百度。
2020/3/5补充
变长数组
从C99开始,C语言新增了可以定义以变量为长度的边长数组。
例如:
#include <stdio.h>
void main()
{
int length = 0;
int length2;
scanf("%d",&length2);
int a[length];
int a2[length2];
}
虽然可以这样定义数组,但是变长数组不可以在定义时进行初始化。
更多详情请参考: