目录
1.数组的定义
2.一维数组
2.1一维数组的创建
2.2一维数组初始化
2.3一维数组访问
3.二维数组
3.1二维数组的创建
3.2二维数组的初始化
3.3二维数组的访问
3.4数组越界访问
3.5数组作为函数参数
1.数组的定义
数组就是一组相同类型的元素的集合,数组按照数据类型分有整数,字符串等类型,按照维度分有一维数组、二维数组等,二维以上的数组应用比较少就不做介绍,重点介绍一维和二维数组
2.一维数组
2.1一维数组的创建
int arr[10]
int arr[10]
int是数组的类型,arr是数组的名称,[10]表示这个数组最多可以存放10个元素
关于“[]”内数字需要说明,在C99标准之前“[]”内只能使用常量,直到C99标准中增加变长数组,才可以使用变量,如果编译器不支持C99的话,那下面的写法就不允许
int n=10; int arr[n];
2.2一维数组初始化
int arr1[5]={1,2,3,4,5};
int arr2[5]={1};
int arr3[]={1,2,3,4,5};
上述三种初始化都可以
第二种首元素为1,数组其它元素默认为0
第三种数组会根据元素个数自动添加“[]”内数字
需要注意char类型的数组
假设有下列的数组
char ch1[]="abc";
char ch2[]={'a','b','c'};
ch1和ch2内元素个数是相同的吗?
我们来看一下
二者元素个数并不相同,笔者在之前博客中有提到过,ch1的写法在字符串后面其实还有一个' '作为结束的标志,而ch2中就没有' ' ,这可以从strlen的返回值看到
2.3一维数组访问
一般通过下标引用操作符“[]”来访问,数组的下标是从0开始
也就是说arr[0]就是访问数组的第一个元素,注意不要和创建数组时的“[]”弄混了,虽然它俩一样,但功能是不同的。
除了下标外,数组还可以用指针访问
还有就是数组在内存中是连续存放的
一般用指针访问数组首元素时直接将数组名传递给指针即可,数组名大多数情况下就是首元素地址。但两种情况除外:
1.sizeof(arr):sizeof求数组的大小,此时arr便不是首元素地址
2.&arr:取出整个数组的地址,以首元素地址表示,虽然值相同,但表达的内容却完全不同
3.二维数组
3.1二维数组的创建
int arr[3][3];
int arr[3][3];
基本和一维数组的创建类似,两个“[]”前面的表示行数,后面的表示列数
行数可以不填,但列数必须填
二维数组中arr[n]表示每一行的首元素的地址arr[0]就是arr[0][0]元素的地址,arr[1]就是arr[1][0]元素的地址,以此类推
3.2二维数组的初始化
int arr1[3][3]={1,2,3,4,5,6,7,8,9};
int arr2[3][3]={{1},{2},{3}};
int arr3[3][3]={0};
我们来看看这三种初始化数组中元素是如何分配的
arr1:第一行是1 2 3,第二行4 5 6,第三行7 8 9
arr2:除每一行首元素的值外,其余都是0,三行首元素值分别为1 2 3,arr2是定义了每一行的首地址的元素
arr3:所有元素都为0
3.3二维数组的访问
同样的,二维数组也可以通过下标和指针来访问,数组名也和一维数组一样表示首元素地址,二维数组在内存中也是连续存放的
3.4数组越界访问
数组的下标是有范围限制的。 数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
就C语言来说,C语言本身并不做数组下标越界的检查,而编译器也不一定会报错,所以在写代码时需要自己做好检查防止数组越界访问
3.5数组作为函数参数
上面介绍过数组名相当于首元素地址,所以数组传参的时候传递给函数的是首元素的地址,而不是整个数组
完



