数组
数组
1.一组具有相同数据类型且连续存放的变量集合
(1)一组变量
(2)类型相同
(3)连续存放
定义数组
类型名 数组名[整型常数表达式](表示元素个数必须是常量)
数组元素的引用
数组名[下标] 通过下标引用数组元素,从而得到数组中的一个变量下标是整型或字符型的常量、变量或表达式
说明:
定义数组的常量表达式必须是大于零的正整数
数组必须先定义,后使用
数组中的元素就是一个变量,代表一个存储单元,可以做普通变量所做的任何运算和操作
只能逐个引用数组元素不能整体引用
引用时不能越界,如num[5]是不存在的。但系统不会检查,可能破坏其他数据,导致系统运行错误。
数据的初始化
实现的方法:
在定义数组时对数组元素赋初值
int a[5]={1,2,3,4,5};
等价于: a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;
只给一部分元素赋值
如: int a[5]={6,2,3};
等价于:a[0]=6; a[1]=2; a[2]=3;a[3]=0;a[4]=0;
数组元素值全部为0
int a[5]={0,0,0,0,0};
int a[5]={0};
对于整个数组元素赋初值来说,可以不指定长度。
int a[]={1,2,3,4,5,6}
编译系统根据初值个数确定数组大小
一维数组和指针
一个数组存储在一块连续内存单元中,数组名就是这块连续内存单元的首地址,其值不可变
第(i+1)个数组元素的地址可表示为&data[i]或(data+i)。
可以通过以下方式为指向数组的指针赋值:
int a[10];
pa=&a[0];或者pa=a;
一个指针变量可以指向一个数组元素
int *ptr, data[10];
ptr=data+3
或者ptr=&data[3]
用带下标的指针变量引用一维数组元素
(1)s[i]//s是数组名,就是普通数组的表示方法。
(2)*(s+i)//s是数组名,因为系统规定数组名代表的是一维数组的首地址,所以通过s+i来移动指针,而*(s+i)来代表数组中的某个元素的值。
(3)*(p+i)//p是指针名,指针p已赋值为某个数组的首地址时,通过指针p+i来移动指针指向某个元素,那么*(p+i)就是某个数组元素的值。
(4)p[i]//指针p已赋值为某个数组的首地址,那么也可以以数组的表示形式来代表某个数组的某个元素。
函数之间对一维数组和数组元素的引用
1.数组元素作实参
当调用函数时,数组元素可以作为实参传给形参,每个数组元素实际上代表内存中的一个存储单元,故和普通变量一样,对应的形参必须是类型相同的变量。数组元素的值可以传送给该变量,在函数中只能对该变量进行操作,而不能直接引用对应的数组元素,更不可能在函数中改变对应数组元素中的值(即形参的改变不会影响实参的值)
2.数组名作实参
数组名可以作为实参传递,但数组名本身是一个地址值,因此,对应的形参就应当是一个指针变量,此指针变量的基类型必须与数组的类型一致。在函数中。可以通过此指针变量来引用调用函数中对应的数组元素,从而达到对调用函数中对应的数组元素进行操作而改变其中的值(即形参的改变也会影响实参的值)。
当数组名作为实参时,对应的形参除了是指针外,还可以用另外两种形式。
对应函数首部可以写成一下三种形式:
arrin(int *a)
arrin(int a[])
arrin(int a[N])
9.5 二维数组的定义和二维数组元素的引用
1.二维数组由若干个一维数组组成:在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的每个元素优势一个一维数组;
int *p, a[3][4];
如以上定义的a数组,实际上可以看作长度为3的数组,可视a数组由a[0]、a[1]、a[2]三个元素组成,而a[0]、a[1]、a[2]中每个元素优势由四个整型元素组成的一维数组。可用a[0][0]、a[0][1]等来引用a[0]中的每个元素,其它一次类推。
二维数组的引用
形式:数组名[下标][下标]
下标是整型字符或字符型的常量,变量或表达式(定义时不能使用变量)】
如:a[1][2] a[i][j]
数组元素如普通变量般可以出现在表达式中
如:a[1][2]=a[2][2]/2
使用数组元素时,应注意不要超出其定义的范围;
如: int a[2][3]; a[2][3]=5;
不能引用整个数组或数组的一行
如 int a[2][3]; a=5,a[0]=3这都是错误的
二维数组的初始化
分行初始化
按元素排列顺序初始化
注意:
int a[][]={{1,2},{3,4},{5,6}};错误,列下标能省略
int a[2][3]={}; int a[2][3]={{},{}};、{{0},{}}错误,不能是空列表
int a[2][3]={1};//不是把所有元素都初始化为1,而是第一个元素为1,其他的为默认为0
int a[2][3]={0};//才是把所有元素初始为零