实用简单的C语言编程课件5第五章_第1页
实用简单的C语言编程课件5第五章_第2页
实用简单的C语言编程课件5第五章_第3页
实用简单的C语言编程课件5第五章_第4页
实用简单的C语言编程课件5第五章_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C程序设计实例教程 山东科技大学机电学院1第5章 数组与指针 【学习要求【学习要求】& 掌握:一维数组的定义、初始化和使用方法掌握:一维数组的定义、初始化和使用方法& 掌握:二维数组的定义、初始化和使用方法掌握:二维数组的定义、初始化和使用方法& 掌握:字符数组的定义、初始化和使用方法掌握:字符数组的定义、初始化和使用方法& 掌握:指针变量的定义掌握:指针变量的定义& 掌握:指向数组的指针的定义和使用方法掌握:指向数组的指针的定义和使用方法& 掌握:冒泡排序原理和顺序查找原理掌握:冒泡排序原理和顺序查找原理& 重点:数组的定义和使用,指向数组的指针的定义重点:数组的定义和使用,指向数组的指针的

2、定义和使用和使用& 难点:排序原理,指针与数组的关系难点:排序原理,指针与数组的关系C程序设计实例教程 山东科技大学机电学院25.1 一 维 数 组&5.1.1 数组的定义数组的定义定义:数组是由一组相同数据类型的数据构成的集合,定义:数组是由一组相同数据类型的数据构成的集合,集合中的每一个元素称为数组元素集合中的每一个元素称为数组元素.数组有一维数组、二维数组和多维数组之分,一维数数组有一维数组、二维数组和多维数组之分,一维数组的定义格式如下:组的定义格式如下: 数据类型说明符数据类型说明符 数组名称数组名称数组元素个数数组元素个数 C程序设计实例教程 山东科技大学机电学院3几点说明:几点说

3、明:(1)“数据类型说明符数据类型说明符”表明了该数组元素的数据类型。表明了该数组元素的数据类型。(2)“数组名称数组名称”是用户自定义的标识符,其字符构成要符合是用户自定义的标识符,其字符构成要符合C语言标识符的约定。语言标识符的约定。(3)“数组元素个数数组元素个数”用于指定数组的长度,是一个常量表达用于指定数组的长度,是一个常量表达式,只能是数值常量或符号常量。式,只能是数值常量或符号常量。(4)“数据类型说明符数据类型说明符”和和“数组元素个数数组元素个数”确定了系统编译确定了系统编译过程中要为该数组分配的内存单元字节数。过程中要为该数组分配的内存单元字节数。(5)C语言中不允许在程序

4、运行中动态改变数组的大小。语言中不允许在程序运行中动态改变数组的大小。(6)同一段程序内,数组名称不能与变量名相同。)同一段程序内,数组名称不能与变量名相同。C程序设计实例教程 山东科技大学机电学院45.1.2 数组元素的引用数组元素的引用必须先定义后使用,只能逐个引用数组元素,格式为:必须先定义后使用,只能逐个引用数组元素,格式为:数组名称数组名称下标下标说明:说明:(1)数组名称是表明要引用哪一个数组中的元素,这个数组必须)数组名称是表明要引用哪一个数组中的元素,这个数组必须在此之前已定义;在此之前已定义;(2)不能一次引用整个数组的所有元素。)不能一次引用整个数组的所有元素。(3)下标用

5、一对中括号)下标用一对中括号括起来,其值必须是整形常量或整形表括起来,其值必须是整形常量或整形表达式。达式。(4)数组元素的下标自)数组元素的下标自0开始,直到数组元素个数减开始,直到数组元素个数减1,如定义了,如定义了5个元素的整型数组个元素的整型数组a,其元素下标的取值只能为,其元素下标的取值只能为0、1、2、3、4。(5)C语言不对数组作超界检查,在程序设计中对数组元素的引语言不对数组作超界检查,在程序设计中对数组元素的引用操作必须由人工检查下标,以防止由于数组下标超界而引起错误。用操作必须由人工检查下标,以防止由于数组下标超界而引起错误。C程序设计实例教程 山东科技大学机电学院55.1

6、.3 数组的初始化数组的初始化1. 先定义后赋值先定义数组,然后再逐个元素进行赋值,这个过程要遵循上先定义数组,然后再逐个元素进行赋值,这个过程要遵循上一节中关于数组元素引用的规定,如:一节中关于数组元素引用的规定,如:int a5;a0=10; a1=9; a2=8; a3=7; a4=6;2. 在定义的同时初始化 将定义和初始化过程写在一起,用于在编译阶段使数组元素将定义和初始化过程写在一起,用于在编译阶段使数组元素获得初值。获得初值。(1)全部元素初始化。将赋值元素写在一对大括号中,元)全部元素初始化。将赋值元素写在一对大括号中,元素之间用逗号分隔。如:素之间用逗号分隔。如:int a5

7、=1,2,3,4,5;等价于等价于a0=1; a1=2; a2=3; a3=4; a4=5;C程序设计实例教程 山东科技大学机电学院65.1.3 数组的初始化数组的初始化对于为全部元素赋初值的情况,可以省略数组定义对于为全部元素赋初值的情况,可以省略数组定义中元素的个数。如:中元素的个数。如:int b=1,2,3,4,5;表明数组;表明数组b的元素的个的元素的个数为数为5。(2)部分元素初始化。当大括号中数值的个数少)部分元素初始化。当大括号中数值的个数少于数组定义时指定的个数时,只给数组前面的一部分于数组定义时指定的个数时,只给数组前面的一部分元素初始化,而其他元素的数值自动取值为元素初始

8、化,而其他元素的数值自动取值为0;如:;如:int a5=2,3;则:则:a0=2; a1=3; a2=0; a3=0; a4=0;C程序设计实例教程 山东科技大学机电学院7说明:说明:(1)数组在定义后没有赋值时,各个元素的值是所占用的空)数组在定义后没有赋值时,各个元素的值是所占用的空间内早先运行其他程序时保留下的数值,并不一定都为间内早先运行其他程序时保留下的数值,并不一定都为0。(2)不能一次给整个数组赋值,如一个由)不能一次给整个数组赋值,如一个由5个整型元素组成个整型元素组成的一维数组,每个元素的数值均为的一维数组,每个元素的数值均为1,如果写成下面的形式:,如果写成下面的形式:i

9、nt a5=1; 系统编译过程将出错,并提示系统编译过程将出错,并提示“Incompatible type conversion in function main(main函数中类型转换不匹函数中类型转换不匹配)配)”。也不能写成。也不能写成int a5=1*5的形式,这样只能是给数组的形式,这样只能是给数组的第一个元素赋初值的第一个元素赋初值5,而其他,而其他4个元素值为个元素值为0。必须写成。必须写成int a5=1,1,1,1,1或或a0=1; a1=1; a2=1; a3=12; a4=1;的形的形式。式。C程序设计实例教程 山东科技大学机电学院8【例【例5.1】用数组求】用数组求Fi

10、bonacci序列的前序列的前15个数。个数。#include stdio.hvoid main() int a15=1,1,i; for(i=0;i=2) ai=ai-1+ai-2; printf(%8d,ai); if(i+1)%5=0) printf(n); C程序设计实例教程 山东科技大学机电学院95.1.4 一维数组的应用实例一维数组的应用实例【例【例5.2】利用数组实现十进制数向二进制数的转换。】利用数组实现十进制数向二进制数的转换。#include stdio.hvoid main() int n,i=0,a33; printf(please input a number:);

11、scanf(%d,&n); while(n) ai+=n%2; n/=2; while(-i=0) printf(%d,ai);C程序设计实例教程 山东科技大学机电学院10【例【例5.3】利用冒泡法原理对数组的元素按升序排序。】利用冒泡法原理对数组的元素按升序排序。冒泡法排序的原理是:如果有冒泡法排序的原理是:如果有n个数要排序,则总共需个数要排序,则总共需要要n-1轮排序,在第轮排序,在第i轮排序中,第一个数与第二个数比轮排序中,第一个数与第二个数比较,若前者大于后者,则交换两者的位置,第二个数与较,若前者大于后者,则交换两者的位置,第二个数与第三个数比较,若前者大于后者,则交换两者的位置,

12、第三个数比较,若前者大于后者,则交换两者的位置,一直进行到第一直进行到第n-i个元素与第个元素与第n+1-i个元素比较,若前者大个元素比较,若前者大于后者,则交换两者的位置,总共比较于后者,则交换两者的位置,总共比较n-i次。此时第次。此时第n+1-i个位置上的数已经按要求排好,所以不再参加后续个位置上的数已经按要求排好,所以不再参加后续的比较和交换操作。的比较和交换操作。若数组的内容为若数组的内容为49,38,65,97,76,13,27,30,C程序设计实例教程 山东科技大学机电学院11则第一轮排序过程如图则第一轮排序过程如图5-6所示,流程图如图所示,流程图如图5-7所示。所示。图图5-

13、6 第一轮排序过程第一轮排序过程4938659776132730 原数 3849659776132730 第一次 3849657697132730 第四次 3849657613972730 第五次 3849657613279730 第六次 3849659776132730 第三次 3849659776132730 第二次 3849657613273097 第七次 C程序设计实例教程 山东科技大学机电学院12流程图如图流程图如图5-7 假 输入 n 个数给 a1 到 an for i=1 to n-1 for j=1 to n-i ajaj+1 真 ajaj+1 输出 a1 到 an C程序设计

14、实例教程 山东科技大学机电学院13参考程序:参考程序:#include stdio.hvoid main() int a11,i,j,t; printf(Input 8 numbers:n); for(i=1;i=8;i+) scanf(%d,&ai); printf(n); for(i=1;i=7;j+) for(j=1;jaj+1) t=aj; aj=aj+1; aj+1=t; printf(The sorted numbers:n); for(i=1;i=8;i+)printf(%d ,ai);C程序设计实例教程 山东科技大学机电学院145.2 二维数组及多维数组5.2.1 二维数组的定

15、义二维数组的定义 二维数组是在一维数组基础上的扩展,总体上可二维数组是在一维数组基础上的扩展,总体上可以看成一个一维数组,只不过一维数组的每个元素以看成一个一维数组,只不过一维数组的每个元素同时又是一个有相同元素个数的一维数组,如图同时又是一个有相同元素个数的一维数组,如图5-10所示的一维数组元素所示的一维数组元素a0,a1和和a2,分别对应,分别对应于一维数组于一维数组b、c、d。a0b0 b1 b2a a1c0 c1 c2a2d0 d1 d2C程序设计实例教程 山东科技大学机电学院15二维数组定义的一般形式是:二维数组定义的一般形式是:数据类型说明符数据类型说明符 数组名称数组名称数组元

16、素个数数组元素个数1数组元素个数数组元素个数2其中:其中:(1)“数据类型说明符数据类型说明符”和和“数组名称数组名称”如一维数组的介绍;如一维数组的介绍;(2)“数组元素个数数组元素个数1”、“数组元素个数数组元素个数2”表示二维数组行和表示二维数组行和列的个数,必须是符号常量、常量表达式或经计算后是整型常量的列的个数,必须是符号常量、常量表达式或经计算后是整型常量的表达式,且必须大于表达式,且必须大于0。二维数组元素的总个数。二维数组元素的总个数=数组元素个数数组元素个数1*数数组元素个数组元素个数2(3)二维数组在概念上是二维的,但是,实际的硬件存储器却)二维数组在概念上是二维的,但是,

17、实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。是连续编址的,也就是说存储器单元是按一维线性排列的。C程序设计实例教程 山东科技大学机电学院165.2.2 二维数组的引用二维数组的引用二维数组元素的引用形式为:二维数组元素的引用形式为:二维数组名称二维数组名称行下标行下标列下标列下标如:如:int a23;a00=1;a10=3; printf(“%d”,a11);说明:说明:(1)应该逐个引用数组元素,不能一次引用整个数组,如:)应该逐个引用数组元素,不能一次引用整个数组,如:int a23;printf(“%d”,a);(2)行下标和列下标必须是整型常量或整型变量,且

18、在书写)行下标和列下标必须是整型常量或整型变量,且在书写时注意不要超过定义的行和列元素的个数,以免由于数组元素超时注意不要超过定义的行和列元素的个数,以免由于数组元素超界而引起错误。界而引起错误。C程序设计实例教程 山东科技大学机电学院175.2.3 二维数组的初始化二维数组的初始化1. 先定义后赋值先定义后赋值先定义数组,然后再逐个元素进行赋值,这个过程先定义数组,然后再逐个元素进行赋值,这个过程要遵循关于二维数组元素引用的规定,如:要遵循关于二维数组元素引用的规定,如:int a23; a00=1; a01=3; a02=5; a10=7; a11=9; a12=11;上述上述6个语句就是

19、为二维数组的个语句就是为二维数组的6个元素进行了赋值。个元素进行了赋值。C程序设计实例教程 山东科技大学机电学院182. 在定义同时进行初始化将初始化和定义过程写在一起,根据一次性赋值元素的个数将初始化和定义过程写在一起,根据一次性赋值元素的个数是否为定义元素的总个数,可以分为全部元素初始化和部分元素是否为定义元素的总个数,可以分为全部元素初始化和部分元素初始化两种形式。初始化两种形式。(1)全部元素初始化。例如:)全部元素初始化。例如:int a23=1,3,5,7,9,11;等价于等价于a00=1; a01=3; a02=5; a10=7; a11=9; a12=11;对于这种为全部元素赋

20、初值的形式,由于二维数组元素在内对于这种为全部元素赋初值的形式,由于二维数组元素在内存中是按照行优先的顺序进行存放,因此可以将内部行元素的一存中是按照行优先的顺序进行存放,因此可以将内部行元素的一对大括号去掉,也就是只保留最外层的一对大括号,系统在编译对大括号去掉,也就是只保留最外层的一对大括号,系统在编译处理阶段,按照行优先的顺序依次为二维数组的元素赋值。如:处理阶段,按照行优先的顺序依次为二维数组的元素赋值。如:int a23= 1,3,5,7,9,11; 系统自动将初始值系统自动将初始值1赋给赋给a00,初,初始值始值3赋给赋给a01,依次类推。,依次类推。C程序设计实例教程 山东科技大

21、学机电学院19为全部的元素进行赋值,可以省略行的元素个数。如:为全部的元素进行赋值,可以省略行的元素个数。如:int a3=1,3,5,7,9,11;(2)部分元素初始化。根据具体情况在每个行元素初始化的)部分元素初始化。根据具体情况在每个行元素初始化的一对大括号中给部分元素赋初始值。一对大括号中给部分元素赋初始值。如:如:int a23=1,3,7;在这种方式下,根据行元素赋值的情况为二维数组的某行的在这种方式下,根据行元素赋值的情况为二维数组的某行的前若干个元素赋初始值,即:前若干个元素赋初始值,即:a00=1,a01=3,a10=7,其他数组元素为其他数组元素为0。如果写成。如果写成in

22、t a23=1,3,7的形式,系统编的形式,系统编译时只按行元素优先的方式从右侧的赋值表中取值,超过赋值表译时只按行元素优先的方式从右侧的赋值表中取值,超过赋值表中元素个数的二维数组元素其值为中元素个数的二维数组元素其值为0,即,即a00=1,a01=3,a02=7,其他数组元素为,其他数组元素为0。C程序设计实例教程 山东科技大学机电学院205.2.4 二维数组的应用实例二维数组的应用实例【例【例5.5】已知某班级】已知某班级5名同学名同学3门功课成绩门功课成绩(65,70,87,90,69,86,34,89,70, 67,90,89,78,69,96),计算每个同学的总成绩以及),计算每个

23、同学的总成绩以及每门课程的平均分。每门课程的平均分。分析:利用二维数组来处理本题目的数据,由于要分析:利用二维数组来处理本题目的数据,由于要计算各同学的总成绩以及各门课程的平均分,所以可计算各同学的总成绩以及各门课程的平均分,所以可以考虑定义以考虑定义6行行4列的二维数组,数组的第列的二维数组,数组的第4列存储各学列存储各学生的总成绩,数组的第生的总成绩,数组的第6行前行前3列存储各门功课的平均列存储各门功课的平均分。分。 C程序设计实例教程 山东科技大学机电学院21&流程图如图流程图如图5-12所示,输出结果如图所示,输出结果如图5-13所示所示 输出换行 输出第 i 个学生成绩 for j

24、=0 to 3 for i=0 to 5 计算各课程均值 ai3=ai3+aij; a5j=a5j+aij; for j=0 to 2 for i=0 to 4 定义数组,整型变量 C程序设计实例教程 山东科技大学机电学院22参考程序:参考程序:#include stdio.hvoid main() int i,j; float a64=65,70,87,90,69,86,34,89,70, 67,90,89,78,69,96; for(i=0;i5;i+) for(j=0;j3;j+) ai3=ai3+aij; /*统计各同学的总成绩统计各同学的总成绩*/ a5j=a5j+aij; /*统计

25、各课程的总分统计各课程的总分*/ a50/=5;a51/=5;a52/=5; /*计算各课程的平均分计算各课程的平均分*/ for(i=0;i6;i+) for(j=0;j4;j+) printf(%7.1f,aij); /*输出各同学的各成绩和总成绩输出各同学的各成绩和总成绩*/ printf(n); /*每输出一个同学成绩后换行每输出一个同学成绩后换行*/ C程序设计实例教程 山东科技大学机电学院23【例【例5.6】求两个矩阵的乘积。】求两个矩阵的乘积。分析:矩阵的内容可以存储到一个二维数组中,两分析:矩阵的内容可以存储到一个二维数组中,两个矩阵相乘的前提是第一个矩阵的列与第二个矩阵的个矩

26、阵相乘的前提是第一个矩阵的列与第二个矩阵的行必须相等,乘积的结果是由第一个矩阵的行和第二行必须相等,乘积的结果是由第一个矩阵的行和第二个矩阵的列组成的二维数组,若个矩阵的列组成的二维数组,若n1=m2,则,则am1n1*bm2n2的结果是的结果是cm1n2。例如矩阵。例如矩阵a是是2行行3列的二维数组,列的二维数组,b是是3行行2列的二维数组,列的二维数组,C程序设计实例教程 山东科技大学机电学院249812376456541*92*73*51*82*63*4 4*95*76*54*85*66*43832 10186cab计算实例如下:计算实例如下:C程序设计实例教程 山东科技大学机电学院25

27、设计的程序流程图如图设计的程序流程图如图5-14所示。所示。 输出换行 输出 cij for j=0 to 1 for i=0 to 1 定义数组,整型变量 for k=0 to 2 计算 cij C程序设计实例教程 山东科技大学机电学院26参考程序参考程序#include stdio.h void main() int a23=1,2,3,4,5,6,b32=9,8,7,6,5,4,i,j,k,c22=0; for(i=0;i2;i+) /*对对c的行进行循环的行进行循环*/ for(j=0;j2;j+) /*对对c的列进行循环的列进行循环*/ for(k=0;k3;k+) /*对对a的列和

28、的列和b的行进行循环的行进行循环*/ cij+=aik*bkj; /*计算计算cij*/ printf(%5d,cij); /*输出输出cij*/ printf(n); /*每输完一行换行每输完一行换行*/ C程序设计实例教程 山东科技大学机电学院275.3 字 符 数 组5.3.1 字符数组的定义字符数组的定义形式:形式:char 数组名称数组名称一维数组大小一维数组大小例如:例如:char a10;定义了字符数组定义了字符数组a,数组的长度是,数组的长度是10,其中每个数组元素均为,其中每个数组元素均为字字符型(符型(char)。系统编译时为该数组分配的空间是)。系统编译时为该数组分配的空

29、间是sizeof(char)*10=1*10=10个字节。个字节。可以为整型变量赋字符型数据也可以定义整型的数组来存储可以为整型变量赋字符型数据也可以定义整型的数组来存储字符型的数据。但是由于整型类型的数据占字符型的数据。但是由于整型类型的数据占2个字节长度,而字个字节长度,而字符型占符型占1个字节,造成了存储空间的浪费,例如:个字节,造成了存储空间的浪费,例如:int a10,占用,占用2*10=20个字节,但只能存储个字节,但只能存储10个数据;个数据;char b10,占用,占用1*10=10个字节,也只能存储个字节,也只能存储10个数据。个数据。C程序设计实例教程 山东科技大学机电学院

30、285.3.2 字符数组的初始化字符数组的初始化&对于一维的字符数组的初始化,可以参照前面讲述的一维数对于一维的字符数组的初始化,可以参照前面讲述的一维数组的初始化方法,不过需要把为各元素赋值的内容写成字符的形组的初始化方法,不过需要把为各元素赋值的内容写成字符的形式,即由一对单引号引起来。如:式,即由一对单引号引起来。如:char c10=c, ,l,a,n,g,u,a,g,e;&如果是对数组的所有元素进行初始化,将所有赋值的内容写如果是对数组的所有元素进行初始化,将所有赋值的内容写在一对大括号中,可以省略数组大小。如:在一对大括号中,可以省略数组大小。如:char c=c, ,l,a,n,

31、g,u,a,g,e;如果实际赋值元素的个数与数组的大小不相等,则按下标顺如果实际赋值元素的个数与数组的大小不相等,则按下标顺序只给数组的前若干个元素进行赋值,其他元素赋空字符。如:序只给数组的前若干个元素进行赋值,其他元素赋空字符。如:char c10=h,e,l,l,o,C程序设计实例教程 山东科技大学机电学院295.3.3 字符数组的引用字符数组的引用对于字符数组,也要遵循先定义后使用的原则,一般一次只引用其中的对于字符数组,也要遵循先定义后使用的原则,一般一次只引用其中的一个元素。对于一维字符数组的引用,也是采用一个元素。对于一维字符数组的引用,也是采用“数组名称数组名称下标下标 ”的方

32、式。的方式。【例【例5.7】输出一个字符数组的内容。】输出一个字符数组的内容。void main() int i; char array5=H,E,L,L,O; for(i=0;i5;i+) printf(%c ,arrayi); printf(n);输出如下结果:输出如下结果:H E L L O当然也可以用当然也可以用“%d”的控制格式来输出字符数组各元素的的控制格式来输出字符数组各元素的ASCII码。码。C程序设计实例教程 山东科技大学机电学院305.3.4 字符串字符串&在在C语言中没有专门定义字符串数据类型,对字语言中没有专门定义字符串数据类型,对字符串的存储一般采用字符数组的方式。符

33、串的存储一般采用字符数组的方式。&字符串是以字符串是以0字符结尾的字符序列,字符结尾的字符序列,&用字符数组存储时将把字符串的所有内容连同用字符数组存储时将把字符串的所有内容连同0字符一起存储到数组中。字符一起存储到数组中。&由于一个字符串的长度是第一个由于一个字符串的长度是第一个0左侧的所左侧的所有字符的个数,因此定义字符数组的大小等于字符有字符的个数,因此定义字符数组的大小等于字符串长度加串长度加1即可。即可。C程序设计实例教程 山东科技大学机电学院31&字符串存储到字符数组时,一般采用下面的几种形式:字符串存储到字符数组时,一般采用下面的几种形式:(1)char 数组名称数组名称数组元素

34、个数数组元素个数= 要赋值的字符串要赋值的字符串; 如如char c10= “hello”; 由于将字符串的所有字符存储到了字符数组中,所以可由于将字符串的所有字符存储到了字符数组中,所以可以省略以省略“数组元素个数数组元素个数”。(2)char 数组名称数组名称数组元素个数数组元素个数= ,0;这种方式下将构成字符串的所有字符以及字符串结束标这种方式下将构成字符串的所有字符以及字符串结束标志各自用单引号括起来,并将这些数据放置在一对大括号志各自用单引号括起来,并将这些数据放置在一对大括号之间,如同前面字符数组的初始化操作。之间,如同前面字符数组的初始化操作。如:如:char c6=H,E,L

35、,L,O,0; char c=H,E,L,L,O,0;C程序设计实例教程 山东科技大学机电学院32v字符数组的输入输出(两种方法)l逐个字符输入输出: %cl整个字符串一次输入或输出: %s例 用%c main() char str5; int i; for(i=0;i5;i+) scanf(“%c”, &stri); for(i=0;i5;i+) printf(“%c”, stri);例 用%s main() char str5; scanf(“%s”, str); printf(“%s”, str);用字符数组名,不要加&输入串长度数组维数遇空格或回车结束自动加0用字符数组名,遇0结束C程

36、序设计实例教程 山东科技大学机电学院33例 main( ) char a5=H,e,l,l,o; printf(“%s”,a); 例 main( ) char a =“Hello”; printf(“%s”,a); 结果:Hello#-=* h e l l oh e l l o02314结果:Hello用“%s”输出时,遇0结束C程序设计实例教程 山东科技大学机电学院34main() char a=h,e,l,0,l,o,0; printf(%s,a);例输出:hel h e l 0 l o 0数组中有多个0时,遇第一个结束C程序设计实例教程 山东科技大学机电学院35main() int i;

37、 char a5; scanf(%s,a); for(i=0;i5;i+) printf(%d,ai);运行情况:(1)若输入 hel , 正常(2)若输入 hell , 正常(3)若输入 hello , 用%s 输出时,会出现问题 h e l 0 h e l l 0 h e l l o输入字符串长度数组维数C程序设计实例教程 山东科技大学机电学院36例例 字符串输入举例字符串输入举例 H o w 0 a r e 0 y o u ? 0 #include main() char a15,b5,c5; scanf(%s%s%s,a,b,c); printf(a=%snb=%snc=%sn,a,b

38、,c); scanf(%s,a); printf(a=%sn,a);运行情况:输入:How are you?输出:a=How b=are c=you?输入:How are you?输出:a=Howscanf中%s输入时,遇空格或回车结束运行情况:输入:How are you?C程序设计实例教程 山东科技大学机电学院37例 若准备将字符串“This is a string.”记录下来,错误的输入语句为:(A)scanf(“%20s”,s);(B)for(k=0;k17;k+) sk=getchar();(C)while(c=getchar()!=n) sk+=c;C程序设计实例教程 山东科技大学

39、机电学院38v常用的字符串处理函数包含在头文件 string.hu字符串输出函数puts格式:puts(字符数组)功能:将字符串输出到终端(输出完,换行)说明:字符数组必须以0结束u字符串输入函数gets格式:gets(字符数组)功能:从终端输入一以回车结束的字符串放入字符数组中,并自动加0,并返回一个函数值说明:输入串长度应小于字符数组维数例 #include main( ) char string80; printf(“Input a string:”); gets(string); puts(string); 输入: How are you?输出: How are you ? C程序设计

40、实例教程 山东科技大学机电学院39u字符串连接函数strcat格式:strcat(字符数组1,字符数组2)功能:把字符数组2连到字符数组1后面返值:返回字符数组1的首地址说明:字符数组1必须足够大 连接前,两串均以0结束;连接后,串1的0取消, 新串最后加0u字符串拷贝函数strcpy格式:strcpy(字符数组1,字符串2)功能:将字符串2,拷贝到字符数组1中去返值:返回字符数组1的首地址说明:字符数组1必须足够大 拷贝时0一同拷贝 不能使用赋值语句为一个字符数组赋值例 char str120,str220; str1=“Hello!”; () str2=str1; ()C程序设计实例教程

41、山东科技大学机电学院40例例 strcpystrcpy与与strcatstrcat举例举例#include #include void main() char destination25; char blank = , c= C+, turbo = Turbo; strcpy(destination, turbo); strcat(destination, blank); strcat(destination, c); printf(%sn, destination);Turbo C+TrboC+0123456789u024.Trbo0123456789u024.Trbo00123456789

42、u24.C程序设计实例教程 山东科技大学机电学院41u字符串比较函数strcmp格式:strcmp(字符串1,字符串2)功能:比较两个字符串比较规则:对两串从左向右逐个字符比较(ASCII码), 直到遇到不同字符或0为止返值:返回int型整数,a. 若字符串1 字符串2, 返回正整数 c. 若字符串1= 字符串2, 返回零说明:字符串比较不能用“=”,必须用strcmpu字符串长度函数strlen格式:strlen(字符数组)功能:计算字符串长度返值:返回字符串实际长度,不包括0在内例 对于以下字符串,strlen(s)的值为:(1)char s10=A,0,B,C,0,D;(2)char s

43、 =“tv0willn”;(3)char s =“x69082n”; 答案:1 3 1C程序设计实例教程 山东科技大学机电学院42#include #include main() char str1 = ”Hello!, str2 = ”How are you?”,str20; int len1,len2,len3; len1=strlen(str1); len2=strlen(str2); if(strcmp(str1, str2)0) strcpy(str,str1); strcat(str,str2); else if (strcmp(str1, str2)0) strcpy(str,s

44、tr2); strcat(str,str1); else strcpy(str,str1); len3=strlen(str); puts(str); printf(”Len1=%d,Len2=%d,Len3=%dn”,len1,len2,len3); 例 strcmp与strlen举例How are you?Hello!Len1=6,Len2=12,Len3=18C程序设计实例教程 山东科技大学机电学院43应用举例例.输入一行字符,统计其中有多少个单词,单词之间用空格分隔开输入一字符串给 string i=0 num=0 word=0当(c=stringi)!=0)c=空格真真假假word=

45、0word=1num=num+1i=i+1输出:numword=0#include main() char string81; int i,num=0,word=0; char c; gets(string); for(i=0;(c=stringi)!=0;i+) if(c= ) word=0; else if(word=0) word=1; num+; printf(There are %d words in the linen,num);C程序设计实例教程 山东科技大学机电学院44当前字符=空格是否未出现新单词,使word=0,num不累加前一字符为空格(word=0),新单词出现,wor

46、d=1,num加1前一字符为非空格(word=1),未出现新单词,num不变否0是11是1未01否0是12否1未12是1未02否0是13是1未03否0是14否1未14否1未14否1未14例 输入:I am a boy. 当前字符是否空格word原值新单词开始否word新值num值Iamaboy.C程序设计实例教程 山东科技大学机电学院45例.有三个字符串,找出其中最大者 H o w 0 H e l l o 0 H i g h 0 str0str1str2#include #include main() char string20,str320; int i; for(i=0;i0)strcpy

47、(string,str0); else strcpy(string,str1); if(strcmp(str2,string)0)strcpy(string,str2); printf(nThe largest string is:n%sn,string);C程序设计实例教程 山东科技大学机电学院465.4.1 地址与指针地址与指针1. 内存地址内存地址每一个存储单元编号,这个编号就是存储单元的地址,以字节为单每一个存储单元编号,这个编号就是存储单元的地址,以字节为单位。位。2. 变量地址变量地址系统编译过程中将为已定义的变量分配相应大小的内存单元,以便系统编译过程中将为已定义的变量分配相应大

48、小的内存单元,以便向这些内存单元中存储数据,也可以根据变量的地址来获取变量的数向这些内存单元中存储数据,也可以根据变量的地址来获取变量的数值。变量所占用内存单元的起始地址,称为变量的地址。值。变量所占用内存单元的起始地址,称为变量的地址。变量的数据类型不同,所占用的内存单元数量也不相同。变量的数据类型不同,所占用的内存单元数量也不相同。如:如: int a=10,b=25;char ch=a;float x=5.4,y=2.87 ; double d=3.1416;变量变量a和和b均是整型变量,在内存占均是整型变量,在内存占2个字节内存单元;变量个字节内存单元;变量ch在内在内存中占用存中占用

49、1个字节的内存单元;变量个字节的内存单元;变量x和和y在内存占在内存占4个字节内存单元;个字节内存单元;d占占8个字节;假如为该部分代码的变量分配的起始地址是个字节;假如为该部分代码的变量分配的起始地址是2000字节位置,字节位置, C程序设计实例教程 山东科技大学机电学院47&内存的存放情况如图内存的存放情况如图5-19所示。所示。1025a5.42.873.14162000200220042005200920132021abchxyd图5-19 内存分配示意图 从图中可以看出,变量从图中可以看出,变量a a的起始地址的起始地址是是20002000字节位置,变量字节位置,变量b b的起始地址

50、是的起始地址是20022002字节,变量字节,变量chch的起始地址是的起始地址是20042004字节字节,变量,变量x x的起始地址是的起始地址是20052005字节,变量字节,变量y y的的起始地址是起始地址是20092009字节,变量字节,变量d d的起始地址的起始地址是是20132013字节。如有一语句为字节。如有一语句为b=b+ab=b+a;,程;,程序执行时将根据变量名序执行时将根据变量名b b和和a a从系统为其分从系统为其分配的内存单元中读取数值配的内存单元中读取数值2525和和1010,然后进,然后进行相加求和,最后将结果行相加求和,最后将结果3535写入到为变量写入到为变量

51、b b分配的内存单元中。分配的内存单元中。 同普通整型变量存储数值一样,如果同普通整型变量存储数值一样,如果把这些变量的地址保存在内存的特定区域把这些变量的地址保存在内存的特定区域中,用特定的变量来存放这些地址,这样中,用特定的变量来存放这些地址,这样用于存放变量地址的变量就是指针变量,用于存放变量地址的变量就是指针变量,利用指针变量也可以访问其指向的变量的利用指针变量也可以访问其指向的变量的数值。数值。C程序设计实例教程 山东科技大学机电学院48&假如有这样一组指针变量假如有这样一组指针变量pa、pb、px、py、pd、pch,分别,分别指向前面定义的变量指向前面定义的变量a、b、x、y、d

52、和和ch,指针变量与其指,指针变量与其指向的变量之间的关系如图向的变量之间的关系如图5-20所示:所示: 2500 2502 2504 2506 2508 2510 2512 10 25 a 5.4 2.87 3.1416 2000 2002 2004 2005 2009 2013 2021 a b ch x y d 2000 2002 2004 2005 2009 2013 pa pb pch px py pd C程序设计实例教程 山东科技大学机电学院49&在该图中左侧的在该图中左侧的2500、2502等是指针变量等是指针变量pa、pb等的内存地址,。等的内存地址,。&由于指针变量由于指针变

53、量pa保存了普通变量保存了普通变量a的内存地址,通的内存地址,通过过pa的内容完全可以找到的内容完全可以找到2000这个内存地址,而该这个内存地址,而该地址正好就是变量地址正好就是变量a的内存起始地址,根据这个地址的内存起始地址,根据这个地址就可以取出该内存单元中的数值就可以取出该内存单元中的数值10。C程序设计实例教程 山东科技大学机电学院503. 对变量数值的引用(1)直接引用)直接引用。通过变量名称来获取变量的数值,编译过程中。通过变量名称来获取变量的数值,编译过程中根据用户定义的变量系统为其开辟存储空间,并将变量的值根据用户定义的变量系统为其开辟存储空间,并将变量的值写入该空间中,若要

54、使用该变量的值时,通过变量名称自动写入该空间中,若要使用该变量的值时,通过变量名称自动找到该变量的内存空间,然后取出该空间的数值。如:找到该变量的内存空间,然后取出该空间的数值。如: int a=8; a+=10;(2)间接引用)间接引用。通过指针来获取其指向内存单元的数值,首先。通过指针来获取其指向内存单元的数值,首先定义指向某个变量的指针,要使用变量的数值时,利用定义指向某个变量的指针,要使用变量的数值时,利用“*指指针名针名”的形式,首先根据指针中保存的地址找到该地址,然的形式,首先根据指针中保存的地址找到该地址,然后读取该地址的内容。如:后读取该地址的内容。如: int a=8,*p=

55、&a; printf(“%d”,*p);C程序设计实例教程 山东科技大学机电学院515.4.2 指针变量定义及指针运算指针变量定义及指针运算 指针变量是存放地址的变量,该指针变量的数值就是其指向变量的指针变量是存放地址的变量,该指针变量的数值就是其指向变量的内存地址,所以通过指针变量的数值就可以获得和使用变量的数值。内存地址,所以通过指针变量的数值就可以获得和使用变量的数值。对于指针变量也要遵循先定义后使用的原则。对于指针变量也要遵循先定义后使用的原则。1. 指针变量的定义指针变量的定义 对于指针变量的定义,一般采用以下定义形式:对于指针变量的定义,一般采用以下定义形式:数据类型数据类型 *

56、指针变量名;指针变量名; 在定义指针变量时,既要说明它是一个指针,同时也要说明该指针指在定义指针变量时,既要说明它是一个指针,同时也要说明该指针指向哪种类型的数据。向哪种类型的数据。 其中:其中: (1)“数据类型数据类型”是指针变量所指向的变量的数据类型,确定了指针是指针变量所指向的变量的数据类型,确定了指针所指向的内存单元的字节长度以及所存储数据的大小范围。所指向的内存单元的字节长度以及所存储数据的大小范围。 (2)“指针变量名指针变量名”是一个变量名称,遵循是一个变量名称,遵循C语言关于标识符的约定;语言关于标识符的约定; (3)“*”表明此处定义的是指针。表明此处定义的是指针。 C程序

57、设计实例教程 山东科技大学机电学院52根据赋值的位置不同,可以有根据赋值的位置不同,可以有2种指针定义形式:种指针定义形式:(1)先定义指针变量再赋值。)先定义指针变量再赋值。例如:例如: int *p1,i=5; float *p2,f=3.14; char *p3,c=h; p1=&i; p2=&f; p3=&c;(2)在定义指针变量时同时进行初始化。)在定义指针变量时同时进行初始化。例如:例如: int i=5,*p1=&i; float f=3.14,*p2=&f; char c=h,*p3=&c;C程序设计实例教程 山东科技大学机电学院53&上述例子中赋值语句上述例子中赋值语句p1

58、= & i表示将变量表示将变量i的内存地的内存地址赋给指针变量址赋给指针变量p1,此时,此时p1就指向变量就指向变量i。同理类推,。同理类推,p2指向指向f,p3指向指向c。图。图5-21是对应的示意图:是对应的示意图: p1 i p2 f p3 c &i 5 &f 3.14 &c h C程序设计实例教程 山东科技大学机电学院54说明:说明:(1)对指针变量进行初始化,必须使用变量的地址,而不能使用整型)对指针变量进行初始化,必须使用变量的地址,而不能使用整型常量或整型变量。如常量或整型变量。如int *p1=2000;()(2)一个指针变量只能指向与其类型相同的变量的地址,否则,可能)一个指

59、针变量只能指向与其类型相同的变量的地址,否则,可能导致程序异常或结果错误。如:导致程序异常或结果错误。如: float PI=3.1415926; int m=5,*p1=&m; p1=Π()(3)使用指针变量之前,必须对其进行初始化(必须赋初值),例如:)使用指针变量之前,必须对其进行初始化(必须赋初值),例如: int m=5,*p1; *p1=20; 由于由于p1没有指向具体的内存单元,既有可能指向内存的空白区域,没有指向具体的内存单元,既有可能指向内存的空白区域,也有可能指向正在使用的区域,如果是后者将可能导致不可预料的也有可能指向正在使用的区域,如果是后者将可能导致不可预料的错

60、误发生。错误发生。C程序设计实例教程 山东科技大学机电学院555.4.3 指针变量的引用指针变量的引用 对于普通变量的访问,可以直接通过变量的名称,这对于普通变量的访问,可以直接通过变量的名称,这是直接访问方式;而对于定义了指针变量并且令其指向是直接访问方式;而对于定义了指针变量并且令其指向普通变量的地址,然后通过该指针来访问普通变量的数普通变量的地址,然后通过该指针来访问普通变量的数值,这是间接访问形式。一般表示形式为:值,这是间接访问形式。一般表示形式为:*指针变量名;指针变量名;C程序设计实例教程 山东科技大学机电学院56【例【例5.12】利用指针变量访问整型变量。】利用指针变量访问整型

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论