第九章 数组.docx
《第九章 数组.docx》由会员分享,可在线阅读,更多相关《第九章 数组.docx(10页珍藏版)》请在冰豆网上搜索。
第九章数组
第九章数组
9.1一维数组的定义和一维数组元素的引用
9.1.1一维数组的定义
类型名数组名[整型常量表达式],……;
inta[8],a,*p;
说明:
(1)定义了一个名为a的一维数组。
(2)方括号中的8规定了数组含有8个元素,它们是a[0]—a[7].
(3)类型名int规定了数组中每个元素都是整型,在每一个元素中只能存放整型数。
(4)每个元素只有一个下标,C语言规定每个数组第一个下标总为0(称为数组下标下界)。
(5)C编译程序将为数组在内存中开辟连续的存储单元。
特点:
数组具有相同的名称,相同的类型,不同的下标,占用一串连续存储空间的变量。
也称为带下标的变量。
9.1.2一维数组元素的引用
a[0]=12;
x=2;
a[x-2]=1545;
a[0]=a[1]+a[2];
a[0]=1;
a[2]=2;
a[a[0]]=456;
注意:
数组元素使用时,下标可是整型表达式,定义时必须是整型常量
(1)一个数组元素实质上就是一个变量名,代表内存中的一个存储单元。
一个数组占有一串连续的存储单元。
(2)在C语言中,一个数组不能整体引用。
9.1.3一维数组的初始化
inta[5]={1,2,3,4,5,6,7,8};
1
2
3
4
5
inta[5]={1,2,3};
1
2
3
0
0
inta[5];
0
0
0
0
0
chars[5]={‘a’,’b’,’c’};
a
b
c
\0
\0
9.1.4通过赋初值定义数组的大小
inta[]={1,2,3,4,5};
1
2
3
4
5
inta[]={1,2,3};
1
2
3
9.1.5一维数组的定义和数组元素引用举例
例9.1P108页
9.2一维数组和指针
9.2.1一维数组和数组元素的地址
inta[5],*p;
10011005100910131017
a[0]a[1]a[2]a[3]a[4]
p=&a[2];
*(++p)a[3]
p=&a[2];
p[1]==*(p+1)<>a[3]
9.2.2通过数组首地址引用数组元素
inta[5],*p;
10011005100910131017
a[0]a[1]a[2]a[3]a[4]
p=&a[0];
p=a;
C语言中规定数组名为数组空间的首地址,而且不能修改这个地址值。
a=&a[2];
*(a+2)a[2]
*(a+i)a[i]
9.2.3通过指针引用一维数组元素
p=a;
*(p+2)a[2]p[2]
*(p+i)a[i]p[i]
9.2.4用带下标的指针变量引用一维数组元素
(1)s[i]
(2)*(s+i)
(3)*(p+i)
(4)p[i]
9.3函数之间对一维数组和数组元素的引用
9.3.1数组元素作实参
形参应该是相应类型的变量
9.3.2数组名作实参
当数组名作为实参时,对应的形参除了是指针外,还可以用另外两种形式。
(1)fun(int*a)
(2)fun(inta[])
(3)fun(inta[20])
注意:
在第(2)和第(3)种形式中,虽然说明的形式与数组的说明相同,但C编译程序都将把a处理成第一种的指针形式。
9.3.3数组元素地址作为实参
形参应该是相应类型的指针
9.3.4函数的指针形参和函数体中数组的区别
(1)在形参中的a[N],C编译程序都将其作为一个指针变量处理。
系统只为形参开辟一个存储单元,并把实参的起始地址存入其中。
(2)函数体中的出现的a[N],是定义了个一数组,系统会为它开辟一串连续的存储单元。
(3)在函数执行完毕,返回主函数时,系统将释放形参以及函数体中的变量和数组所占用的存储单元。
因此,不要返回函数体中变量的地址,这样做,主函数中的指针变量将不指向任何对象而成为“无向指针”。
9.4一维数组应用举例
(1)对数组赋值(赋有规律值、赋随机值)
(2)输出所有数组元素的值
(3)把数组元素中符合条件的元素存入另一个数组中。
(拆分,合并)9。
29
(4)对数组元素排序(升序、降序,倒序)
(5)在数组元素中查找某个指定的数
(6)删除数组元素中的某个数139页9。
28
(7)向有序数组中插入一个数,插入后保证数组仍然有序。
P140页9.31
(8)给数组赋互不相同的值。
P140页9.33
9.5二维数组的定义和二维数组元素的引用
9.5.1二维数组的定义
二维数组的定义形式:
类型名数组名[常量表达式1][常量表达式2],……;
例:
inta[3][4];
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[2][1]
a[2][2]
a[2][3]
说明:
(1)定义了一个名为a的二维数组
(2)a数组中每个元素都是整型
(3)a数组中共有3×4个元素
(4)a数组的逻辑结构是一个具有如下形式的3行4列的矩阵
在C语言中,可以把一个二维数组看成是一个一维数组,每个数组元素又是包含有若干个元素的一维数组。
9.5.2二维数组元素的引用
引用(使用)二维数组元素时必须带有两个下标。
数组名[行下标][列下标]
a[0][0]=23;
a[x][y]=23;
注意:
引用二维数组元素时,一定要把两个下标分别放在两个方括号内。
9.5.3二维数组的初始化
1、所赋初值个数与数组元素个数相同
inta[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
2、每行所赋初值个数与数组元素个数不同
inta[4][3]={{1,2},{4,5},{7},{10}};
系统会自动给该行后面的元素补初值0。
3、所赋初值行数少于数组行数
inta[4][3]={{1,2},{4,5}};
系统将自动给后面各行的元素补初值0。
4、赋初值时省略行花括号
inta[4][3]={1,2,4,5};
9.5.4通过赋初值定义二维数组的大小
inta[][3]={{1,2,3},{4,5},{6},{8}};
intc[][3]={1,2,3,4,5};
第一维的大小按以下规则决定:
(1)当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小。
(2)当初值的个数不能被第二维的常量表达式的值除尽时,则:
第一维的大小=所得商数+1
9.5.5二维数组的定义和数组元素引用举例
给二维数组的所有元素赋值
把二给数组的所有元素输出
外循环变量控制的是行下标,就是按行操作
外循环变量控制的是列下标,就是按列操作
9.6二维数组和指针
9.6.1二维数组和数组元素的地址
有以下定义:
int*p,a[3][4];
1、二维数组a由若干个一维数组组成
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[2][1]
a[2][2]
a[2][3]
p=a[i]是合法的
a[i]*(a+i)
所以p=*(a+i)也是合法的
*(a[i]+j)a[i][j]
p=a[i]
*(p+j)p[j]a[i][j]
2、二维数组名也是一个地址值常量
二维数组名同样也是一个存放地址常量的指针,其值为二维数组中第一个元素的地址。
以上a数组,数组名a与a[0]的值相同,只是其基类型为具有4个整型元素的数组类型。
3、二维数组元素的地址
二维数组元素的地址可以由表达式&a[i][j]求得,也可以通过每行的首地址来表示。
二维数组元素的地址可以用以下五种形式求得:
(1)&a[i][j]
(2)a[i]+j
(3)*(a+i)+j
(4)&a[0][0]+4*i+j
(5)a[0]+4*i+j
9.6.2地址引用二维数组元素
(1)a[i][j]
(2)*(a[i]+j)
(3)*(*(a+i)+j)
(4)(*(a+i))[j]
(5)*(&a[0][0]+4*i+j)
9.6.3通过建立一个指针数组引用二维数组元素
int*p[3],a[3][2],i,j;
p[0]=a[0];
p[1]=a[1];
p[2]=a[2];
for(i=0;i<3;i++)p[i]=a[i];
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
p[0]
p[1]
p[2]
*(p[0]+1)a[0][1]p[0][1]
*(p[i]+j)a[i][j]p[i][j]
9.6.4通过建立一个行指针引用二维数组元素
inta[3][2],(*p)[2];
a[0][0]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
*(a+i)a[i]
*(a[i]+j)a[i][j]
p=a;
*(p+i)p[i]a[i]
*(p[i]+j)p[i][j]a[i][j]
9.7二维数组名和指针数组
9.7.1二维数组名作为实参时实参和形参之间的数据传递
(1)fun(double(*a)[N])
(2)fun(doublea[][N])
(3)fun(doublea[M][N])
9.7.2指针数组作为实参时实参和形参之间的数据传递
(1)fun(int*a[M])
(2)fun(int*a[])
(3)fun(int**a)
9.8二维数组程序举例
(1)对二维数组所有元素赋值
(2)输出二维数组中的所有元素
(3)求二维数组中每行(列)之和及平均值
(4)求二维数组中周边元素之和
(5)求二维数组中对角线元素之和
(6)二维数组的转置及某几行(列)交换
(7)找二维数组所有元素中的最大(最小)数所在的行列
(8)按行(列或对角线)排序