------- android培训、java培训、期待与您交流! ----------
数组的基本概念
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。
在c语言中,数组属于构造数据类型,一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。
数组的几个名词
1)数组:一组具有相同数据类型的数据的有序的集合
2)数组元素:构成数组的数据,数组中的每一个数组元素具有相同的名称,不同的下标,可以作为单个变量使用,所以也称为下标变量
3)数组的下标:是数组元素的位置的一个索引或指示,从0开始
4)数组的维数:数组元素下标的个数、根据数组的维数可以将数组分为一维、二维、三维、多维数组。
按存储的内容分类
数值数组 用来存储数值的
字符数组 用来存储字符 ‘a’
指针数组 用来存放指针(地址)的
结构数组 用来存放一个结构体类型的数据
按维度分类
一维数组
二维数组
多维数组
一维数组介绍
如果一个数组的所有元素都不是数组,那么该数组称为一维数组
数组的使用流程:定义数组--->给数组初始化--->使用数组
一维数组的定义
在c语言中使用数组必须先进行定义。一维数组的定义方式为:
类型说明符 数组名[常量表达式];
类型说明符:
是任一种基本数据类型或构造数据类型。
数组名
用户定义的数组标识符。
方括号中的常量表达式
表示数据元素的个数,也称为数组的长度
注意事项
1)数组的长度可以是一个常量,亦可以是常量表达式
2)数组的长度不可以是一个变量(c99标准要求)
3)数组的长度可以使用宏定义(#define)
4)数组名的命名规则:严格按照标识符的命名规范
5)数组名不能和其他变量同名
6)定义数组的时候,还可以定义普通变量——int x,y,a[41];
一维数组的初始化
数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。
初始化方式有两种:
1、定义的同时初始化
类型说明符 数组名 [常量表达式] = {值,值,……值};
其中在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。
1)定义的同时完全初始化
int a[3] = {1,2,3}
int a2 [ ] = {233,34,3} 数组的长度根据后面大括号中赋值的个数来决定的
2)定义的同时进行部分初始化
int a1[3] = {2,23}
int a 4 [10] = {[3]=23,[8]=34};
定义一个长度为10的数组,数组名是a4[3]. 表示下标为3的元素赋初值为23,
如果进行了部分初始化,数组中的其他元素都被系统初始化为0
2、先定义,后初始化
int a5[4];
通过下标法进行初始化
a5[0] = 12; //给第一个元素赋值12
使用先定义后初始化的方式,如果部分数组元素被初始化了,系统不会对没有初始化的那部分元素进行赋值0的操作。
一维数组的引用方式
数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。
数组元素访问一般形式为:
数组名[下标]
其中下标只能为整型常量或整型表达式。如为小数时,c编译将自动取整。
如果要逐个访问数组的元素的话,这就叫数组的遍历。(利用for循环)
一维数组的存储方式
1)计算机会给数组分配一块连续的存储空间
2)数组名代表数组的首地址,从首地址位置,依次存入数组的第1个、第2个、、、第n个元素
3)每个元素占用相同的字节数(取决于数组类型)
4)并且元素之间的地址是连续的
5)数组名代表了数组的首地址==数组的第一个元素的地址
6)数组名是一个常量 存储的就是数组的首地址
一维数组长度计算方法
因为数组在内存中占用的字节数取决于其内存的数据类型和数据的个数
数组在内存中占用的总字节数:sizeof(数组名)
所以计算数组长度可以使用如下方法
数组的长度=数组占用的总字节数 / 数组元素占用的字节数
注意:一维数组的越界问题
数组元素作为函数参数
数组可以作为函数的参数使用,进行数据传送。
数组用作函数参数有两种形式:
一种是把数组元素(下标变量)作为实参使用;
数组元素就是下标变量,它与普通变量并无区别。因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单项的值传送。
一种是把数组名作为函数的形参和实参使用。
1) 用数组元素作函数参数不要求形参也必须是数组元素,但是用数组名做函数参数时,则要求形参和相对应的实参都必须是类型相同的数组
2)在c语言中,数组名除作为变量的标识符之外,数组名还代表了该数组在内存中的起始地址,因此,当数组名做函数参数时,实参与形参之间不是“值传递”,而是“地址传递”,实参数组名将该数组名的 起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。
3)在变量作函数参数时,所进行的值传送是单向的。即只能从实参传向形参,不能从形参传回实参。形参的初值和形参相同,而形参的值发生改变后,实参并不变化,两者的终值是不同的。
注意:
c语言中规定,不管什么类型的数据,数据的内存地址在内存中占8个字节
关于数组名作为函数参数后,数组的长度信息丢失