------- Java培训、Android培训、iOS培训、.Net培训 、期待与您交流 --------
一 数组
1.数组的定义:把具有相同类型的若干个变量按有序的形式组织起来,这些按序排列的同类数据元素的集合。属于构造类型。
2.数组的构成:a.数组元素:构成数组的数据,就是下表变量
b.数组的下标:数组元素位置的一个索引
c.数组元素下标的个数。
3. 分类
1)按存储内容:a.数值数组:存放数值的
b.字符数组:用来存放单个字符的
c.指针数组:存放指针地址的
d.结构数组:存放一个结构体类型的数据
2)按维度分类:一维数组 二维数组 三维数组
4.数组元素作为函数参数:
a.把数组元素作为实参使用,也就是一个值传递。
b.把数组名作为函数的形参和实参使用,是一个地址传递。
!!!数组元素作为函数参数和数组名作为函数的实参的不同点:数组元素做函数参数不要求形参也是数组元素,但数组名作函数参数,要求形参和实参都必须是类型相同的数组。
5.数组名作为函数参数的注意点
a.形参数组的类型要和实参一致。
b.形参的数组长度可以和实参的数组不一致。
c.形参数组的长度可以不写。
d.数组名作为函数参数后,有关数组长度丢失的问题。所有的类型字节都是8.因为C语言规定,不管什么类型的数据,数据的内存地址在内存中占用8个字节。
二 一维数组
1.一维数组定义:一个数组里面存储的是基本类型的数据。数组的每个元素都不是一个数组。
2.格式:类型说明符 数组名[常量表达式];
类型说明符:一种基本数据类型,是用来存放数组元素的类型,而不是数组名的类型。
数组名:用户自定义的数组标示符。
[常量表达式]:数组长度。
3.注意事项
1)数组的长度可以是一个常量,也可以是一个表达式。
2)数组名严格按照标示符的命名规范。
3)数组名不能和其他变量同名。
4)数组的长度不可以是一个变量。
5)数组长度可以使用宏定义。
6) 定义数组的同时可以定义普通变量:int x,y,a[5];
4.一维数组的初始化:数组在定义时给数组每一个元素赋予初值。
格式: 类型说明符 数组名[常量表达式]={值,值.....值};
方法:
1)定义的同时初始化
a.定义的同时完全初始化 int a[3]={1,2,3}; int a[]={1,2,3};长度可不写
b.定义的同时部分初始化 int a1[3]={1,2}; int a1[3]={[1]=2,[2]=9};其中[1]和[2]为下标
2)先定义,后初始化(通过下标进行初始化)int a[3]; a[0]=1,a[1]=2....
!!! int len=5;
int a[len]={1,2,3,4,5}Xcode特有的数组长度可以为变量,但是不允许这样初始化。
!!!如果数组没有初始化,数组元素有值的,是垃圾值。如果进行部分初始化,没有初始化的其他元素被系统自动初始化为0了。字符数组没有被初始化的那部分元素的ASCII值也被系统自动初始化为0了。
!!!使用先定义后初始化的方式,如果部分数组元素被初始化了,系统不会对没有初始化的元素进行自动初始化0了。
5.数组的访问(引用):就是对数组元素的访问(printf("%d\n,"a[i]);),要是逐个访问数组的元素,这就叫数组的遍历。使用for循环。
6.一维数组的存储方式
a.计算机会给数组分配一块连续的存储空间
b.数组名代表数组的首地址,从首地址位置开始,依次存入数组的第一个,第n个元素。
c.每个元素占用相同的字节数
d.并且元素之间的地址是连续的
!!!先分配的存在高地址,后分配的存在低地址
7.一维数组的地址用 %p输出
a.通过打印两个数组的地址,证明了先定义的数组分配在高地址。
b.数组各元素之间的地址是连续的,两个元素相差4个字节。
c.数组名和数组的第一个元素的地址是相同的。b=b[0];
!!!打印数组名的地址不需要加&符号,打印每一个元素的要加上&符号。
数组名是一个常量,就是元素的首地址。
8.数组元素的下一个地址:根据下标计算下个下标的地址。
int nums[]={1,2,3};--->nums+sizeof(int)*下标
9.一维数组长度的计算 数组的长度=数组占用的总字节数/数组元素占用的字节数
len=sizeof(a)/sizeof(int)
10.一维数组的越界:访问了不属于你自己的空间,那个空间给其他的变量使用了,如果你访问了,那个空间有可能会改变你空间的值。所以是不安全的。