第9章 数组
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指针变量与其指向的变量具有相同数据类型
19
• 指针的算术运算(指针指向数组):
– p±i ⇔ p ±i×d (i为整型数,d为p指向的变量所占字节数) – p++, p--, p+i, p-i, p+=i, p-=i等 – 若p1与p2指向同一数组,p1-p2=两指针间元素个数⇔(p1p2)/d – p1+p2 无意义 a数组 例 p指向float数,则 p+1 ⇔ p+1 ×4 p a[0] p+1,a+1 例 p指向int型数组,且p=&a[0]; a[1] 则p+1 指向a[1] p+1 a[1] a[2] 例 int a[10]; int *p=&a[2]; p++; *p=1; 例 int a[10]; int *p1=&a[2]; int *p2=&a[5]; 则:p2-p1=3;
15
例
49 38 38 49 65 76 97 97 13 76 13 97 27 97 27 30 97 30 初 始 关 键 字
38 49 65 13 76 27 76 13 76 30 27 30 76 97 第 一 趟
38 49 65 13 65 27 13 65 30 27 65 30 76 第 二 趟
0 1 2 3 4 5
1 1 2 3 5 ……...
f[0] f[1] f[2] f[3] f[4] f[5]
19
f[19]
f[19]
13
#define N 6 数组定义:必须用常量表达式 main() { int a[N],b[‘B’-60],c[]={1,2,3,4,5,6},i; for(i=0;i<N;i++) scanf(“%d%d”,&a[i],&b[i]); for(i=0;i<N;i++) 数组元素引用 printf(“%d ”,a[i]); printf(“\n”); for(i=0;i<N;i++) printf(“%d ”,b[i]); printf(“\n”); for(i=0;i<N;i++) c[i]=a[i]+b[N-i-1]; for(i=0;i<N;i++) printf(“%d ”,c[i]); 14 }
第九章 数组
• • • • • 理解为什么要使用数组 理解 C 语言中数组 熟练掌握一维数组的使用 掌握二维数组的使用 熟悉用数组实现常用的算法
1
第九章 数组
9.1 一维数组的定义和一维数组元素的引用 9.2 一维数组和指针 9.3 函数之间对一维数组和数组元素的引用 9.4 一维数组应用举例 9.5 二维数组的定义和二维数组元素的引用 9.6 二维数组和指针 9.7二维数组和指针数组做为实参 9.8 二维数组程序举例
程序举例
例 用数组求Fibonacci数列前20个数
F1 = 1 F2 =1 Fn = Fn −1 + Fn − 2
(n = 1) ( n = 2) (n = 3)
#include <stdio.h> main() { int i; int f[20]={1,1}; for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<20;i++) { if(i%5==0) printf("\n"); printf("%12d",f[i]); } }
2
为什么要使用数组
唉,有这么多不同主题的书。在哪 里才能找到有关中国音乐的书呢?
3
为什么要使用数组
文学类
中国音乐类
计算机类
西方音乐类
4
为什么要使用数组
内存
数组
120
容器中保 存的物品
数组的元素
65 98 4
日常生活中的容器
程序中的数组
5
• 数组是可以在内存中连续存储多个元素的结构 • 数组中的所有元素必须属于相同的数据类型 Rate 1.5
17
9.2一维数组和指针
指向数组元素的指针变量
例 int array[10]; int *p; p=&array[0]; //⇔ p=array; 或 int *p=&array[0]; array[9] 或 int *p=array; 整型指针p &array[0] ... 数组名是表示数组首地址的地址常量 array[0] array[1] array[2] array[3] p
1
p+i,a+i
a[3] a[4] a[5] a[6] a[7] a[8] a[9]20
p+9,a+9
• 指针变量的关系运算
– 若p1和p2指向同一数组,则 » p1<p2 表示p1指的元素在前 » p1>p2 表示p1指的元素在后 » p1==p2 表示p1与p2指向同一元素 – 若p1与p2不指向同一数组,比较无意义 – p==NULL或p!=NULL
a[0] *a a[1] *(a+1) a[2] *(a+2)
a[9] *(a+9)
p+9
*(p+9) p[9]
下标法
指针法
22
a[i] ⇔ p[i] ⇔ *(p+i) ⇔*(a+i)
•通过数组的首地址引用数组元素 main() { int a[5],i; for(i=0;i<5;i++) scanf(“%d”,&a[i]); main() for(i=0;i<5;i++) printf("%d ", a[i]); { int a[5],i,*p; for(i=0;i<5;i++) } scanf(“%d”,&a[i]); for(i=0,p=a;i<5;i++) printf("%d ", *(p+i)); }
例 用冒泡法对10个数排序
排序过程: (1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然 后比较第二个数与第三个数;依次类推,直至第n-1个数和第 n个数比较为止——第一趟冒泡排序,结果最大的数被安置在 最后一个元素位置上 (2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在 第n-1个元素位置 (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束
24
•用带下标的指针变量引用一维数组元素 main() { int a[5],*p,i; p=a; for(i=0;i<5;i++) scanf("%d",&p[i]); for(i=0;i<5;i++) printf("%d ", p[i]); }
25
练习: int a[]={1,2,3,4,5,6,7,8,9,10},*p=a,i; 数组元素地址的正确表示: (A)&(a+1) (B)a++ (C)&p (D)&p[i] √
23
•通过指针引用一维数组元素 main() { int a[5],*p,i; p=a; for(i=0;i<5;i++) scanf("%d",p+i); for(i=0;i<5;i++) printf("%d ", *(p+i)); } main() { int a[5],i,*p; for(p=a;p<a+5;p++) scanf("%d",p); for(p=a;p<a+5;p++) printf("%d ",*p); }
( )
10
一维数组的初始化
初始化方式
int a[5]={1,2,3,4,5}; 在定义数组时,为数组元素赋初值 等价于:a[0]=1; (在编译阶段使之得到初值) a[1]=2; a[2]=3; a[3]=4; a[4]=5;
说明: 数组不初始化,其元素值为随机数 只给部分数组元素赋初值 当全部数组元素赋初值时,可不指定数组长度 int arr[10] = {10,9,8,7,6,5,4,3,2,1,0}; // 错误!越界了 int arr[10] = {9,8,7,5}; //正确,后面的6个元素 未初始化 int arr[] = {9,8,7}; //正确:元素个数为 3 int arr[]={}; //错误,到底是几个元素?
a[i]⇔a[i+1] 输出a[1] 到 a[n]
#include <stdio.h> main() { int a[10],i,j,t; printf("Input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); 假 for(j=1;j<=9;j++) for(i=1;i<=10-j;i++) if(a[i]>a[i+1]) {t=a[i]; a[i]=a[i+1]; a[i+1]=t;} printf("The sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); }
来自百度文库
38 49 13 13 49 27 49 30 27 49 30 65 第 三 趟
38 13 13 38 27 27 38 30 30 38 49
13 27 30 38
13 27 30
13 27
第 四 趟 五 趟
第 六 趟
第 七 趟
第
n=8
16
输入n 个数给a[1] 到 a[n] for j=1 to n-1 for i=1 to n-j 真 a[i]>a[i+1]
一维数组的定义
定义方式: 例 int a[6]; a
0 1 2 a[0] a[1] a[2] a[3] a[4] a[5]
[ ] :数组元素下标 单目运算符 优先级(15) 左结合 不能用( )
数据类型
数组名[常量表达式];
合法标识符 表示元素个数 下标从0开始
3 数组名表示内存首地址, 4 是地址常量 5
21
– 数组元素表示方法
地址 a a+1 a+2 a[0] a[1] a[2] a[3] a[9] ... a+9 元素
[] 变址运算符 a[i] ⇔ *(a+i) 地址 p p+1 p+2 a[0] a[1] a[2] a[3] ... a[9] 元素 *p p[0] *(p+1) p[1] *(p+2) p[2]
18
– 指针的运算
• 指针变量的赋值运算
如 int i, *p; p=1000; i=p;
(×) (×)
– p=&a; (将变量a地址⇒p) – p=array; (将数组array首地址⇒p) – p=&array[i]; (将数组元素地址⇒p) – p1=p2; (指针变量p2值⇒p1) – 不能把一个整数⇒p,也不能把p的值⇒整型变量 ⇒p, p ⇒
11
#include <stdio.h> #define SIZE 10 例 读10个整数存入数组,找出其中最大值和最小值 main() { int x[SIZE],i,max,min; printf("Enter 10 integers:\n"); for(i=0;i<SIZE;i++) 步骤: { printf("%d:",i+1); 1. 输入:for循环输入10个整数 scanf("%d",&x[i]); 2. 处理: } (a) 先令max=min=x[0] max=min=x[0]; (b) 依次用x[i]和max,min比较(循环) for(i=1;i<SIZE;i++) 若max<x[i],令max=x[i]{ if(max<x[i]) max=x[i]; 若min>x[i],令min=x[i] if(min>x[i]) min=x[i]; 3. 输出:max和min } printf("Maximum value is %d\n",max); printf("Minimum value is %d\n",min); 12 }
9
例 int data[5]; 例 int i=15; data[0]=1; int data[i]; (×不能用变量定义数组维数) data[5]=10; //C语言对数组不作越界检查,使用时要 注意 一维数组的引用 数组必须先定义,后使用 只能逐个引用数组元素,不能一次引用整个数组 数组元素表示形式: 数组名[下标] 其中:下标可以是常量或整型表达式 例 int a[10]; printf(“%d”,a); (×) 必须 for(j=0;j<10;j++) printf(“%d\t”,a[j]);
数组元素 3 2 1 0 下标
下标标明了元素在数 组中的位置
3.2 0.09 45.3987
6
一维数组 示例:学员单门课程的成绩
多维数组
89 90 77
…
示例:学员两门课程的成绩
科 目
0 1
0 73 45
1 90 80
2 33 87
学号
7
数组类型 2-2
8
9.1一维数组的定义和一维数组元素的引用