计算机程序设计基础精讲多练第章.ppt

上传人:牧羊曲112 文档编号:6059614 上传时间:2023-09-19 格式:PPT 页数:48 大小:267.63KB
返回 下载 相关 举报
计算机程序设计基础精讲多练第章.ppt_第1页
第1页 / 共48页
计算机程序设计基础精讲多练第章.ppt_第2页
第2页 / 共48页
计算机程序设计基础精讲多练第章.ppt_第3页
第3页 / 共48页
计算机程序设计基础精讲多练第章.ppt_第4页
第4页 / 共48页
计算机程序设计基础精讲多练第章.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《计算机程序设计基础精讲多练第章.ppt》由会员分享,可在线阅读,更多相关《计算机程序设计基础精讲多练第章.ppt(48页珍藏版)》请在三一办公上搜索。

1、,第六章 指针和引用,3,教学目标,(1)了解指针类型及引用类型的概念及二者的关系与区别;(2)了解指针与引用变量的使用与操作方法;(3)了解用指针访问变量、数组、字符串的方法。,4,基本内容,6.1 指针6.2 指针与数组6.3 引用,5,6.1 指针,6.1.1 地址6.1.2 指针的定义6.1.3 指针的初始化6.1.4 指针的使用6.1.5 函数的传址调用方式,6,6.1.1 地址,计算机的内存储器就象一个一维数组,每个数组元素就是一个存储单元。地址是存放信息数据的内存单元的编号。程序中定义的任何变量、数组或函数等,在编译时都会在内存中分配一个确定的地址单元。,7,如何表示地址?,凡是

2、存放在内存中的程序和数据都有一个地址,可以用它们占用的那片存储单元中的第一个存储单元的地址表示。C+规定:变量的地址:可以用取地址运算符&来获取数组的地址:可以用数组名表示函数的地址:可以用函数名表示,8,例6-1:取地址运算符&和指针运算符*,#include using namespace std;int main()int x=100;cout 变量的值是:x endl;cout 变量的所在的地址是:,9,6.1.2 指针的定义,数据类型*指针变量名;例:int*ptr;float*array;char*s1,*s2;说明:数据类型是指针所指向变量的类型;*是一个说明符,它不是指针变量名

3、的一部分,而是表示这里说明的是一个指针;指针变量名是指针变量的名字,10,指针的初始化,指针在定义后必须初始化才能使用;否则,结果不确定。指针初始化的一般格式:数据类型*指针变量名 初始地址值;或数据类型*指针变量名;指针变量名=数据对象地址;其中数据对象地址可以是变量、数组、函数、结构等的地址。如:int x=7;int*ptr=/初始化为空指针,11,6.1.4 指针的使用,/例6-2:通过指针访问变量#include using namespace std;int main()int x=7;int*ptr;ptr=,12,6.1.5 函数的传址调用方式,实参与形参有3种结合方式:值调用

4、、传址调用和引用调用传址调用赋予了函数操作“异地”数据的权利,对函数的独立性有一定影响传址调用可实现多值传递使用传址调用方式时,被调用函数的形参是指针,与之对应的实参要用地址值。,13,例6-3 交换两个变量的值,算 法:交换两个变量x和y的值一定要用到第三个变量t作周转:t=x;x=y;y=t;,14,交换两个变量的值(修改前的程序),void swap(int x,int y)int tmp;tmp=x;x=y;y=tmp;int main()int x=2,y=3;cout“x=“x“,y=“yendl;swap(x,y);coutAfter exchange x,15,交换两个变量的值

5、(修改后),#include using namespace std;void swap(int*xp,int*yp)int tmp;tmp=*xp;*xp=*yp;*yp=tmp;int main()int a=2,b=3;cout Before exchange:a=a,b=b endl;swap(a,b);swap(*a,*b);swap(,运行结果:Before exchange:a=1,b=2After exchange:a=2,b=1,16,6.2 指针与数组,6.2.1 指针与一维数组6.2.2 指针与字符串,17,6.2.1 指针与一维数组,计算机中处理数组时,实际上是将ai转

6、换成*(a+下标表达式值)的形式。即 ai*(a+i)因为数组名可以表示该数组的首地址,所以:ai*(a+i)*(ptr+i)其中,ptr是指向a的指针。由此可见,用指针处理数组及元素是最快捷的方式,18,例6-4 用多种方法输出数组元素,#include using namespace std;int main()int a=1,2,3,4,5;/int*ptr;/ptr=a;for(int i=0;i5;i+)coutait;/一般方法:使用数组名和下标/cout*(a+i)t;/使用数组名和指针运算/*cout*ptrt;/使用指针变量的方法ptr+;*/coutendl;return

7、0;,19,直接和间接使用变量,20,6.2.2 指针与字符串,指针-字符数组(字符串)例题分析设char*string;char string14;string=string1;有string10=*stringstring11=*(string+1),21,例6-5:计算字符串长度,#include using namespace std;int mystrlen(char*string)char*ptr=string;while(*ptr!=0)ptr+;/指针后移,直到指向字符串结束标志return ptr-string;int main()char str=How long am I

8、?;coutstr 的长度是mystrlen(str)endl;return 0;,22,6.3 引用,6.3.1引用的概念6.3.2 函数的引用调用方式,23,6.3.1引用的概念,引用是一种特殊类型的变量,可以被认为是另一个变量的别名。引用运算符“,24,*和&,注意:*和,/说明符:声明ptr是一个int型指针/指针运算符:取指针ptr所指向地址内存储的数值/说明符:声明一个int型的引用ref/地址运算符:取变量x的地址,25,6.3.2 函数的引用调用方式,实参与形参有3种结合方式:值调用、传址调用和引用调用在形参名前加上引用说明符“&”即将其声明为引用,实参则直接采用一般的变量名。

9、在函数调用时,形参就成了实参的别名,对引用的操作就等同于直接对主调函数中原变量的操作。,26,#include using namespace std;void swap(int,交换两个整形变量的值(引用调用),运行结果:Before exchange:a=1,b=2After exchange:a=2,b=1,27,扩展阅读,6.4 动态存储分配6.5 自定义数据类型6.5.1 结构体类型6.5.2 枚举类型,28,6.4 动态存储分配,运算符new用来申请所需的内存指针=new 数据类型(初值);运算符delete用于释放先前申请到的存储块delete 指针;例:int*p=new in

10、t(5);delete p;为数组申请动态内存:指针=new 数据类型数组元素个数;释放数组占用的动态内存空间:delete 指针;例:int*p=new int size;delete p;,29,例 6-8:用动态数组来求斐波那挈数列的前n项,#include using namespace std;int main()int n;coutn;int*p=new intn+1;p0=0;p1=1;coutp0tp1t;for(int i=2;i=n;i+)pi=pi-2+pi-1;coutpit;delete p;/释放数组空间return 0;,30,6.5 自定义数据类型,6.5.1

11、结构体类型6.5.2 枚举类型,31,构造类型数据各元素是属于同一个类型的数组。不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。例如,学生信息:学号、姓名、性别、各科成绩,地址等这些项都与某一学生相联系。如下图所示:可以看到性别(sex)、年龄(age)、成绩(score)、地址(addr)都属于学号为20090531和名为“LeiFen”的学生。如果将num、name、sex、age、score、addr分别定义为互相独立的简单变量,难以反映它们之间的内在联系。,6.5.1 结构体类型,32,结构体作为一种数据构造类型,在程序中使用时要经历定义声明调用

12、三个过程。结构体的定义就是对结构体的结构进行描述结构体是由不同的数据类型的数据组成的。组成结构体的每个数据称为该结构体的成员项,简称成员。,struct Student int id;/学号 char name20;/姓名 float score;/成绩;,struct 结构体类型名 数据类型 成员变量1;数据类型 成员变量2;数据类型 成员变量n;,结构体类型的定义,33,(1)先定义结构体类型,再声明结构体变量。例如,struct Date/定义日期类型 int da_year;int da_mon;int da_day;Date yesterday,today,tomorrow;/说明了

13、3个日期类型的变量(2)定义类型的同时声明变量。例如,struct Date int da_year;int da_mon;int da_day;yesterday,today,tomorrow;(3)直接定义结构体类型变量,不出现结构体类型名。,结构体变量的声明,34,结构体变量的使用,结构体类型变量的成员变量的引用方法为:结构体类型变量名.成员变量名通过指针访问结构体的成员要用箭头操作符-结构体指针变量名-成员变量名 例:Student stu1,stu2,*ptr=,35,结构体的初始化,可采用以下任意一种方式:先声明结构体变量,再赋初值Student stu1;stu1.id=2008

14、6035;strcpy(stu1.name,Zhang3);stu1.score=96;声明时赋值:在声明结构体变量的同时对其赋初值Student stu2=20091001,Li4,85.5;注意:不能在定义结构体类型时给成员变量赋值,/例 6-9:学生信息-结构体#include#include using namespace std;struct Studentint id;/学号char name20;/姓名float score;/成绩;int main()Student stu1,stu2=20091001,Li4,85.5;stu1.id=20086035;strcpy(stu1

15、.name,Zhang3);stu1.score=96;cout第1个学生信息:stu1.idtstu1.nametstu1.scoreendl;cout第2个学生信息:stu2.idtstu2.nametstu2.scoreendl;stu2=stu1;cout复制后第2个学生信息变为:endl;cout第2个学生信息:stu2.idtstu2.nametstu2.scoreendl;return 0;,37,如果某个数据项只可能取少数几种可能的值,则可将该数据项定义为枚举类型数据。格式如下:enum 枚举类型名 枚举符号表;例:enum SexType male,female;enum W

16、eekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;enum Game win,lose,tie;,6.5.2 枚举类型,38,枚举变量的声明和使用,语法形式如下:枚举类型名 枚举变量名;例如:Weekday today;today=Wed;每个枚举元素实际上是一个以其所在位置顺序为值的常量(0,1,2,),其取值为某一个整数值,所以枚举类型无法直接输出。要想获得变量的符号值,须采用间接方法。,/例6-10:枚举类型的用法enum SexType male,female;struct Studentint id;/学号char name20;/姓名SexType sex;/性

17、别float score;/成绩;int main()Student stu1=20086035,Zhang3,male,96;cout学生信息:stu1.idtstu1.nametstu1.scoretstu1.sexendl;cout学生信息:stu1.idtstu1.nametstu1.scoret;switch(stu1.sex)case male:cout男endl;break;case female:cout女endl;break;default:break;return 0;,运行结果:学生信息:20086035 Zhang3 96 0学生信息:20086035 Zhang3 9

18、6 男,40,上机指导,6.6 注释号在调试中的作用6.7 条件编译,41,应用举例,例6-12 使用指针编写一个对整型数组进行排序的函数,排序方法使用冒泡排序法。算法讨论:冒泡排序法是将相邻的元素进行比较,如果不符合所要求的顺序,则交换这两个元素,对整个数列中所有的元素都进行这种比较,直到所有的元素都排好序为止。,/例6-12:冒泡排序程序#include using namespace std;void bubbleup(int*ptr,int count)for(int i=0;ii;j=j-1)if(*(ptr+j-1)*(ptr+j)int tmp=*(ptr+j-1);*(ptr+

19、j-1)=*(ptr+j);*(ptr+j)=tmp;int main()int list=53,7,12,61,90,70,87;int i;cout 排序前:;for(i=0;i7;i+)cout listi t;bubbleup(list,7);cout endl排序后:;for(i=0;i7;i+)cout listi t;coutendl;return 0;,43,应用举例,例6-13 用指针编写一个程序,要求不仅能够统计一个字符串中字符的个数,还能分别指出其中大、小写字母、数字以及其他字符的个数。分析:通过定义一个指向字符数组的指针,对字符串中每一个字符都按照ASCII码表中的编码

20、进行判断,确定其所属的类别并进行计数,直到整个字符串结束为止。,#include using namespace std;int main()char str=Current:Clear,Wind:E at 6 km/h,Humidity:30%;char*ptr=str;/使指针ptr指向字符数组strint total,capital,small,numeral,others;/定义各种计数器变量total=capital=small=numeral=others=0;/初始化所有计数器变量while(*ptr!=0)/如果*ptr=0则表示字符串结束total+;/总字符数if(*ptr

21、=A,45,void mystrcpy(char*destin,char*source)while(*source!=0)/若*source=0则表示原字符串结束*destin=*source;/复制字符source+;/source移向原字符串中的下一个字符destin+;/destin移向新字符数组的下一位置*destin=0;/在新字符串尾部添写一个结束符0,例6-14 字符串复制,46,应用举例,例6-15 编写一个函数,用于去掉字符串前面的空格,并用主函数进行验证。分析:令指针指向字符串首地址逐个判断字符串前面的字符是否为空格。如是,则向后移动指针继续判断,直到第一个非空格的字符出现

22、将从该指针开始的字符串复制回原字符串,#include#include using namespace std;char*myltrim(char*string)char*ptr=string;while(*ptr=)ptr+;strcpy(string,ptr);return string;int main()char str=Who is Buddha?;cout 截取前的原始字符串是:strendl;cout 截取空格后的字符串是:myltrim(str)endl;return 0;,运行结果:截取前的原始字符串是:Who is Buddha?截取空格后的字符串是:Who is Buddha?,48,学好程序设计语言的唯一途径是 你的编程能力与你在计算机上投入的时间成,结束语,上机练习,正比,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号