《C语言程序设计》第5章---数组、字符串、指针.ppt
《《C语言程序设计》第5章---数组、字符串、指针.ppt》由会员分享,可在线阅读,更多相关《《C语言程序设计》第5章---数组、字符串、指针.ppt(81页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本章要求:本章要求:1、掌握、掌握C语言数组在内存中的存储形式语言数组在内存中的存储形式2、掌握一维数组和二维数组的定义及使用、掌握一维数组和二维数组的定义及使用3、掌握使用指针处理数组的方法、掌握使用指针处理数组的方法4、掌握使用字符数组及指针处理字符串数据、掌握使用字符数组及指针处理字符串数据的方法的方法5、掌握与数组有关的基本算法(如排序、查、掌握与数组有关的基本算法(如排序、查找、插入、删除等)的程序设计找、插入、删除等)的程序设计 重点:重点: 一维数组、二维数组的定义与使用一维数组、二维数组的定义与使用方法,使用指针访问数组和字符串的方法,使用指针访问数组和字符串的方法。方法。 难
2、点:难点: 二维数组与指针;与数组有关的常二维数组与指针;与数组有关的常用算法(排序、查找与插入等)。用算法(排序、查找与插入等)。5.1 数组概述数组概述 例例. 输入输入10个数,求出他们的平均数。个数,求出他们的平均数。main() int n,a,s=0; float ave; for (n=1;nave) printf(“%d”,a1);if (a2ave) printf(“%d”,a2);if (a3ave) printf(“%d”,a3); . /* 实际程序是不能这样写实际程序是不能这样写*/思考:思考: 发现:如果不是发现:如果不是10个数,而是个数,而是100,1000,甚
3、至是甚至是10000,此时按上面方法编写程序就,此时按上面方法编写程序就非常冗长。非常冗长。 如果可以使用如果可以使用循环循环来编写,程序可以简洁来编写,程序可以简洁许多。许多。 要使用循环:要使用循环:必须使用必须使用ai (i=1,210)的形的形式来代表式来代表a1,a2a10 在在C语言中使用语言中使用“数组数组”来实现来实现: aia0 a1a9#include void main()int n,i;float s=0, ave, a10; for(i=0;i10;i+) scanf(%f,&ai); s=s+ai; ave=s/10; for(i=0;iave) printf(%f
4、 ,ai);声明有声明有10个元素个元素的一维数组的一维数组aa0 a1 a9aiaiaiai在程序设计中,为了处理方便,在程序设计中,为了处理方便, 把具有相把具有相同类型的若干变量按有序的形式组织起来。同类型的若干变量按有序的形式组织起来。这些按序排列的这些按序排列的同类数据同类数据元素的集合称为元素的集合称为数组数组。在语言中,在语言中, 数组属于构造数据类型。数组属于构造数据类型。 按类型分为按类型分为: 数值数组、数值数组、 字符数组、字符数组、 指指针数组、结构数组针数组、结构数组等等 按维数可分为:按维数可分为:一维数组、二维数组、一维数组、二维数组、多维数组多维数组。 数组在内
5、存中占用一片连续的存储单元数组在内存中占用一片连续的存储单元5.2 一维数组一维数组只有一个下标变量的数组,称为一维数组。只有一个下标变量的数组,称为一维数组。 5.2.1 一维数组定义一维数组定义 一般形式为:一般形式为: 类型符类型符 数组名数组名 常量表达式常量表达式 ; 其中:其中: 类型说明符是任一种基本数据类型或构类型说明符是任一种基本数据类型或构造数据类型,造数据类型, 数组名是用户定义的标识符;数组名是用户定义的标识符; 方括号中的常量表达式表示数据元素的方括号中的常量表达式表示数据元素的个数,也称为数组的长度。个数,也称为数组的长度。 例如:例如:int a10; float
6、 b10,c20; char ch20; 数组在内存中占据一片连续的存储空间:数组在内存中占据一片连续的存储空间: 以以 int a5为例,在内存中为:为例,在内存中为:a0a1a2a3a4相当于声明了相当于声明了5个整型变量个整型变量说明:说明:数组的所有元素的数据类型都是相同的。数组的所有元素的数据类型都是相同的。数组取名规则应符合标识符的规定,数组数组取名规则应符合标识符的规定,数组名不能与同一函数中其它变量名相同:名不能与同一函数中其它变量名相同: int a; float a10; 是错误的。是错误的。C语言中规定数组的下标从语言中规定数组的下标从0开始,方括号开始,方括号中常量表达
7、式表示数组元素的个数。中常量表达式表示数组元素的个数。不能在方括号中用变量来表示元素的个数,不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。例如:但是可以是符号常数或常量表达式。例如:int n=5,an; 是错误的。是错误的。5.2.2 一维数组的初始化一维数组的初始化1、数组声明时初始化、数组声明时初始化 在编译阶段进行的。这样将减少运行时间,在编译阶段进行的。这样将减少运行时间,提高效率。提高效率。数组初始化的一般形式为:数组初始化的一般形式为:类型符类型符 数组名数组名常量表达式常量表达式=值值,值值值值;例如:例如: int a10= 0,1,2,3,4,5,
8、6,7,8,9 ; 相当于相当于a0=0; a1=1;. a9=9; 说明:说明:int a10=0,1,2,3,4;int a10=1;static int a3;int a =1,2,3,4,5;int a5=1,2,3,4,5,1 ;给前给前5个元素赋个元素赋值,其余赋值,其余赋0值值不能给数组整体不能给数组整体赋值,改成赋值,改成1可以省略数组元可以省略数组元素个数。素个数。静态存储类型,静态存储类型,初值为初值为0初值的个数不能初值的个数不能超过元素个数超过元素个数2、使用赋值语句初始化、使用赋值语句初始化 用赋值语句初始化是在程序执行过程中实现用赋值语句初始化是在程序执行过程中实现
9、的。例如:的。例如:int a3;a0=5;a1=8;a2=9; 对于数组的元素用赋值语句初始化,常常使对于数组的元素用赋值语句初始化,常常使用循环来完成,例如:用循环来完成,例如:int k,a10;for(k=0;k10;k+) ak=1; /*对数组中所有元素赋初值为对数组中所有元素赋初值为1*/5.2.3 数组元素的引用数组元素的引用 数组元素是组成数组的基本单元,数组元素数组元素是组成数组的基本单元,数组元素可以看成一种变量。引用数组元素有下标法和可以看成一种变量。引用数组元素有下标法和指针法。本小节介绍下标法,指针法将在指针法。本小节介绍下标法,指针法将在5.5节节中介绍。中介绍。
10、使用下标法引用一维数组元素的一般形式为:使用下标法引用一维数组元素的一般形式为: 数组名数组名下标下标 其中,的下标只能为整型常量或整型表达式。其中,的下标只能为整型常量或整型表达式。若为小数时,若为小数时,C编译将自动取整。编译将自动取整。说明:说明:int n=3,a10;an=5; an+1=10;int a10,x,y;a10=5;int a10;printf(%d,a); 正确代码。引用数正确代码。引用数组元素的时候,可组元素的时候,可以用变量。以用变量。错误代码错误代码。最大下。最大下标为标为9,没有,没有a10元素。元素。错误代码错误代码。不能用不能用一个语句输出整个一个语句输出
11、整个数组。数组。5.2.4 一维数组的基本操作一维数组的基本操作可通过循环给数组元素输入数据可通过循环给数组元素输入数据 int a10,i,; for(i=0;i10;i+) scanf(“%d”,&ai);也可通过循环输出数组元素也可通过循环输出数组元素 for(i=0;i10;i+) printf(“%d”,ai);例,输入例,输入5个数,再按倒序输出个数,再按倒序输出5-1.c求数组中最大元素求数组中最大元素#define N 10main() int i,p,max,aN; printf(Enter %d Numbersn,N); for(i=0;iN;i+) scanf(%d,&a
12、i); max = a0; for(i=1;i max) max = ai; printf( The Max =%dn,max);p=0;a%d=%dn,p,max); p = i; 及其下标及其下标求最大、最小值以及排序求最大、最小值以及排序算法中的最大、最小值确算法中的最大、最小值确定定 都可以采用类似方法:都可以采用类似方法:把第一个元素假想为当前把第一个元素假想为当前找到的最大、最小值,在找到的最大、最小值,在后续的比较中进行更新。后续的比较中进行更新。5-2.c一维数组的倒置一维数组的倒置for(i=0;i N/2;i+) t=ai; ai=aN-i-1; aN-i-1=t;0 0
13、0 2 4 6 8 1 3 5 7 91 1 9 2 4 6 8 1 3 5 7 02 2 9 7 4 6 8 1 3 5 2 03 3 9 7 5 6 8 1 3 4 2 04 4 9 7 5 3 8 1 6 4 2 05 5 9 7 5 3 1 8 6 4 2 0a0 a1 a9类似问题:字符串的回文比较类似问题:字符串的回文比较5-3.c5.2.5 一维数组的应用举例一维数组的应用举例 例:如果要统计例:如果要统计09,1019,2029,. 8089,9099分数段及分数段及100分的人数。分的人数。 编程分析:编程分析:a数组用来存放数组用来存放20个学生成绩;个学生成绩;另用数组另
14、用数组bn来存各分数段的人数:来存各分数段的人数:bn0存存09分的人数,分的人数,bn1存存1019分的人数,分的人数,bn9存存9099分的人数,分的人数, bn10存存100分的人数。分的人数。 5-4.c一维数组的应用举例:一维数组的应用举例:5.8.1 排序问题排序问题(教材(教材P.166) 数据的排序就是将一批数据由小大到数据的排序就是将一批数据由小大到(升序)(升序)或由大到小或由大到小(降序)(降序)进行排进行排列。常用的有列。常用的有选择法、冒泡法。选择法、冒泡法。 首先要将需要排序的数据放到数组中,首先要将需要排序的数据放到数组中,这样,便于我们排序。这样,便于我们排序。
15、1选择法排序选择法排序 算法描述:从剩下的元素集中找一个最小的元素依次放到算法描述:从剩下的元素集中找一个最小的元素依次放到第第i个位置。个位置。i从从0开始开始原始数据:原始数据:8 6 9 3 2 7第一轮后:第一轮后:2 6 9 3 8 7第二轮后:第二轮后:2 3 9 6 8 7第三轮后:第三轮后:2 3 6 9 8 7第四轮后:第四轮后:2 3 6 7 8 9第五轮后:第五轮后:2 3 6 7 8 9a0 a1 a2 a3 a4 a5869327 6个数需要经历个数需要经历5轮选择(轮选择(i=04) 每一轮做的工作:每一轮做的工作: 从第从第i个到最后一个个到最后一个中找一个最小的
16、。中找一个最小的。 与第与第i个交换。放到个交换。放到ai这个位置。这个位置。代码:代码: for(i=0; i5; i+) p=i; for(j=i+1; j6; j+) if(ajap) p=j; t=ai; ai=ap; ap=t; iN-1;iN; 从第从第i个到最个到最后一个中找后一个中找一个最小的。一个最小的。 与第与第i个交个交换。换。6个数需要经历个数需要经历5轮选择轮选择(i=04)5-5.c 2冒泡法排序(升序)冒泡法排序(升序)算法描述算法描述第一轮:第一轮:8693268932689326839268329 683296382963289 第二轮:第二轮:5个数共个数共
17、4轮即可轮即可代码:代码: for(i=0; i4; i+) for(j=0; jaj+1) t=aj; aj=aj+1; aj+1=t; iN-1;iN-i-1;每轮需要经过每轮需要经过4-i次比较次比较发现前面的数比后面发现前面的数比后面的数大则需要交换,的数大则需要交换,把大的换到后面去。把大的换到后面去。5个数需要经历个数需要经历4轮选择轮选择(i=03)5-6.c5.3 二维数组与多维数组二维数组与多维数组5.3.1 二维数组的声明二维数组的声明 二维数组说明的一般形式是:二维数组说明的一般形式是:类型符类型符 数组名数组名常量表达式常量表达式1常量表达式常量表达式2; 其中:其中:
18、常量表达式常量表达式1表示第一维下标的长度表示第一维下标的长度常量表达式常量表达式2 表示第二维下标的长度。表示第二维下标的长度。例如:例如: int a34; float b44; char c510; int a34; 该数组的下标变量共有该数组的下标变量共有34个,个,即:即:a00a01a02a03a10a11a12a13a20a21a22a23a00 a01 a02 a03 a10a23二维数组在内存的存放顺序是二维数组在内存的存放顺序是“先行后列先行后列”注意:语言允许二维数组注意:语言允许二维数组a34a34可分解为可分解为三个一维数组,其数组名分别为三个一维数组,其数组名分别为
19、a0, a1, a0, a1, a2a2。这三个一维数组都有。这三个一维数组都有4 4个元素。个元素。5.3.2 二维数组元素的引用二维数组元素的引用二维数组的元素的引用形式为:二维数组的元素的引用形式为: 数组名数组名下标下标下标下标使用二维数组的情况举例:使用二维数组的情况举例: 学生多门功课的成绩,如:学生多门功课的成绩,如:a1003可以用来记录可以用来记录100个学生个学生3门功门功课的成绩。课的成绩。 矩阵,如:矩阵,如:a33可以用来记录可以用来记录33的矩阵。一个的矩阵。一个数组元素正好存放一个矩阵的元素。数组元素正好存放一个矩阵的元素。5.3.3 二维数组的初始化二维数组的初
20、始化 二维数组初始化也是在类型说明时给各二维数组初始化也是在类型说明时给各下标变量赋以初值。下标变量赋以初值。1. 按行分段赋值可写为按行分段赋值可写为 int 53=80,75,92,61,65,71, 59,63,70,85,87,90,76,77,85; 2. 按行连续赋值可写为按行连续赋值可写为 int a53= 80,75,92,61,65,71,59,63, 70,85,87, 90,76,77,85 ; 注意:这两种赋初值的结果是完全相同的。注意:这两种赋初值的结果是完全相同的。说明:说明:int a33=1,2,3;int a 3=1,2,3,4,5,6,7,8;1002003
21、001234567805.3.4 二维数组的基本操作二维数组的基本操作二维数组的操作一般需要使用二重循环。二维数组的操作一般需要使用二重循环。1二维数组的输入输出二维数组的输入输出设数组己定义设数组己定义 int aNM;其程序段如下:其程序段如下: for(i=0;iN;i+) for(j=0;jM;j+) scanf(“%d”,&aij); for(i=0;iN;i+) for(j=0;jM;j+) printf(“%d ”,aij); printf(“n”);2求最大元素及其所在的行和列求最大元素及其所在的行和列 编程基本思路与在一维数组求最大值元素相编程基本思路与在一维数组求最大值元素
22、相同,同,row, column存放最大值所在行列号。存放最大值所在行列号。3. 矩阵的转置(方阵)矩阵的转置(方阵) 对比一维数组的倒置,注意:对比一维数组的倒置,注意: 哪些元素要交换?哪些元素要交换? 和谁交换?和谁交换?a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a30 a31 a32 a33 如果不是方如果不是方阵,则要定义阵,则要定义另一个数组。另一个数组。bji = aij5.3.6 多维数组的声明和引用多维数组的声明和引用 在处理三维空问题等其它复杂问题时要使用在处理三维空问题等其它复杂问题时要使用到三维及三维以上的数组,通常把三维
23、及三维到三维及三维以上的数组,通常把三维及三维以上的数组称为多维数组。以上的数组称为多维数组。 定义多维数组的格式如下:定义多维数组的格式如下:类型符类型符 数组名数组名常量常量1常量常量2常量常量3;例如:例如:int a555; /* 声明声明a是三维数组是三维数组*/float b26105; /* 声明声明b是四维数组是四维数组*/注意:操作多维数组常常要用到多重循环。注意:操作多维数组常常要用到多重循环。2.6 指针变量指针变量2.6.1 地址与指针的概念地址与指针的概念 数据存放在内存中,每个字节内存单元按数据存放在内存中,每个字节内存单元按顺序编号,称为顺序编号,称为“内存地址内
24、存地址”。 通过内存单元的地址即可准确地找到该内通过内存单元的地址即可准确地找到该内存单元。存单元。 变量的地址就是变量的指针变量的地址就是变量的指针5x2003变量名变量名变量值变量值变量地址变量地址p指针指针变量变量2.6.3 指针变量的定义指针变量的定义 指针变量定义的一般形式:指针变量定义的一般形式: 类型符类型符 *标识符标识符;说明:说明: “*”直接修饰的直接修饰的“标识符标识符”是指针变量。是指针变量。int *p,x; /* p是指针变量,是指针变量,x是整型变量是整型变量 */ 指针所指对象的类型称为指针的基准类型。指针所指对象的类型称为指针的基准类型。int *p1; /
25、* p1的基准类型为整型,即的基准类型为整型,即p1所所指向对象的类型是整型指向对象的类型是整型 */char *p2; /* p2的基准类型为字符型,即的基准类型为字符型,即p2所指向对象的类型是字符型所指向对象的类型是字符型 */2.6.4 指针变量的初始化指针变量的初始化#include void main() int *p; *p =5; printf(*p=%dn,*p); 错误代码:可能引错误代码:可能引起严重后果起严重后果不定值不定值p指向不可预料的指向不可预料的内存空间内存空间*p可以表示可以表示p变量所指的变量所指的变量变量初始化指针变量的方法主要有以下初始化指针变量的方法主
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 语言程序设计 数组 字符串 指针
限制150内