欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C++第3章指针.ppt

    • 资源ID:68701704       资源大小:594.50KB        全文页数:45页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C++第3章指针.ppt

    第第 3章章 指针指针Visual C+与面向对象程序设计教程教学目标教学目标v介绍介绍+中指针的基本概念。中指针的基本概念。学习要求学习要求v掌握指针的概念和定义方法。掌握指针的概念和定义方法。v掌握指针的操作符和指针的运算掌握指针的操作符和指针的运算v掌握指针与数组的关系。掌握指针与数组的关系。v掌握指针与字符串的关系。掌握指针与字符串的关系。v掌握掌握new和和delete操作符作用和使用方法。操作符作用和使用方法。授课内容授课内容v3.1 3.1 地址与指针地址与指针v3.2 3.2 指针运算指针运算v3.3 3.3 指针与数组指针与数组v3.4 3.4 动态存储分配动态存储分配v3.5 3.5 指针和函数(自学内容)指针和函数(自学内容)地地 址址v计算机的内存储器就象一个一维数组,每个数组元计算机的内存储器就象一个一维数组,每个数组元素就是一个存储单元。素就是一个存储单元。v地址是存放信息数据的内存单元的编号。地址是存放信息数据的内存单元的编号。v程序中定义的任何变量、数组或函数等,在编译时程序中定义的任何变量、数组或函数等,在编译时都会在内存中分配一个确定的地址单元。都会在内存中分配一个确定的地址单元。vC+规定:规定:变量的地址变量的地址:可以用取地址运算符可以用取地址运算符&来获取来获取数组的地址数组的地址:可以用数组名表示可以用数组名表示函数的地址函数的地址:可以用函数名表示可以用函数名表示指指针针v指针是指针是C+语言中的一种数据类型,是专门用来处理地址语言中的一种数据类型,是专门用来处理地址的;也可以说:的;也可以说:指针是包含另一个变量地址的变量指针是包含另一个变量地址的变量。v指针变量用星号指针变量用星号*表示,定义指针变量是通过定义该表示,定义指针变量是通过定义该指针所指向的变量类型进行的。指针所指向的变量类型进行的。例如例如:int*ptr;ptr是一个整形的指针变量是一个整形的指针变量v指针运算符指针运算符*具有取地址内容的作用具有取地址内容的作用。例如例如:x=5;ptr=&x;*(&x)即取即取x地址中值地址中值5地址和指针的关系地址和指针的关系v用来存放地址的变量就叫作指针变量。用来存放地址的变量就叫作指针变量。v设设 intint x x,*ptrptr ;当定义了整型变量当定义了整型变量x x和指针和指针ptrptr后,系统分配两个后,系统分配两个存储单元存储单元10001000和和10041004;v执行执行 x=3x=3;v执行执行 ptr=&xptr=&x;v执行执行*ptrptr=5=5;100010043xptr100010003510001004&x1004&x指针的声明指针的声明 v声明的一般格式:声明的一般格式:类型描述符类型描述符*指针变量名表;指针变量名表;v举例:举例:int *ptr;float *array;char *s1,*s2;v指针类型指针类型内存地址值是固定不变的,不同类型的指针本身所占据的存储区域都内存地址值是固定不变的,不同类型的指针本身所占据的存储区域都一样大。一样大。规定了用指针间接访问数据时的访问方式规定了用指针间接访问数据时的访问方式为指针的算术运算提供依据为指针的算术运算提供依据指针声明的举例指针声明的举例v指针在指针在定义后定义后必须必须初始化初始化才能使用;否则,结果才能使用;否则,结果不确定。不确定。v指针初始化的一般格式:指针初始化的一般格式:指针变量名指针变量名=数据对象;数据对象;数据对象可以是变量、数组、函数、结构等。数据对象可以是变量、数组、函数、结构等。v举例:举例:int*ptr,i=10;ptr=&i;/指向单个变量指向单个变量char*sp=“string”;/指向字符串指向字符串int a5,*ap;ap=a;/指向数组指向数组int max(),(*fp)();fp=max;/指向函数指向函数3.2 指针的运算指针的运算1 1“*”和和“&”运算符运算符2 2指针变量算术运算指针变量算术运算3 3指针变量比较运算指针变量比较运算4 4指针变量下标运算指针变量下标运算“*”和和“&”运算符运算符v“&”称为取地址运算符,用以返回变量的指针,即变量称为取地址运算符,用以返回变量的指针,即变量的地址;的地址;v“*”称为指针运算符,用以返回指针所指向的基类型变称为指针运算符,用以返回指针所指向的基类型变量的值。量的值。v例如:例如:intint *ptr*ptr;/声明声明ptrptr是一个是一个intint型指针型指针y=y=*ptr*ptr;/将指针将指针ptrptr所指向的值赋给变量所指向的值赋给变量y yintint&ref;&ref;/声明一个声明一个intint型的引用型的引用ref ref ptrptr=&x;=&x;/取变量取变量x x的地址的地址*ptr*ptr=2;=2;例例3.1 交换两个变量的值交换两个变量的值v算算 法:法:交换两个变量交换两个变量x x和和y y的值一定要用到第三个变量的值一定要用到第三个变量t t作为周转:作为周转:t=x;t=x;x=y;x=y;y=t;y=t;v实参与形参有实参与形参有3 3种结合方式:种结合方式:值调用、值调用、地址调用地址调用和引用调用和引用调用例例3.1 交换两个变量的值交换两个变量的值void swap(void swap(intint x,intx,int y)y)intint tmptmp;tmptmp=x;x=y;y=x;x=y;y=tmptmp;void main()void main()intint x=2,y=3;x=2,y=3;coutcout“x=x=“xx“,y=,y=“yyendlendl;swap(x,y);swap(x,y);coutcoutAfter exchange x&y:After exchange x&y:”endlendl;coutcout“x=x=“xx“,y=,y=“yyendlendl;例例3.1 交换两个变量的值(修改后)交换两个变量的值(修改后)void swap(void swap(intint *xp,int*xp,int *yp*yp)intint tmptmp;tmptmp=*xp*xp;*xp*xp=*yp*yp;*yp*yp=tmptmp;void main()void main()intint x=2,y=3;x=2,y=3;coutcout“x=x=“xx“,y=,y=“yyendlendl;swap(&x,&y);swap(&x,&y);coutcoutAfter exchange x&y:After exchange x&y:”endlendl;coutcout“x=x=“xx“,y=,y=“yyendlendl;图图3.4 函数函数swap()中的运算结束时中的运算结束时的内存分配示意图的内存分配示意图指针变量的其他运算指针变量的其他运算v指针赋值指针赋值 将一个指针赋值给另一个指针,结果是两个指针指向一个相将一个指针赋值给另一个指针,结果是两个指针指向一个相同的地址单元。同的地址单元。例如,例如,jp=&a;ip=jp;ip和和jp都指向都指向a。v指针的关系运算指针的关系运算表示所指变量在内存中的位置关系表示所指变量在内存中的位置关系例如,例如,ip=jpv指针的算术运算指针的算术运算只进行加减,完成指针移动,实现对不同数据单元的访问操只进行加减,完成指针移动,实现对不同数据单元的访问操作。对不同的类型,移动的单位长度不同。作。对不同的类型,移动的单位长度不同。指针指针+/-整数表达式整数表达式 例如,例如,ptr+;指针指针ptr右移一个地址。右移一个地址。3.3、指针与数组、指针与数组v计算机中处理数组时,实际上是将计算机中处理数组时,实际上是将aiai转换成转换成*(a+a+下标下标表达式值)的形式。即表达式值)的形式。即 ai *ai *(a+ia+i)因为数组名可以表示该数组的首地址,所以也就有:因为数组名可以表示该数组的首地址,所以也就有:ai *ai *(a+ia+i)*(ptr+iptr+i)其中,其中,ptrptr是指向是指向a a的指针。的指针。v由此可见,用指针处理数组及元素是最快捷的方式由此可见,用指针处理数组及元素是最快捷的方式例题分析例题分析v设设char*ptr,*qtr;char string6;v令令ptr=string;string1=*(ptr+1)qtr=ptr+strlen(string);Big010001003100010011002100310041005例例3.2 字符串复制字符串复制v算法分析算法分析令指针指向字符串令指针指向字符串1首地址首地址将当前地址内容送字符串将当前地址内容送字符串2串串1 1地址地址+1+1重复重复、直到整个字符串复制完毕为止;直到整个字符串复制完毕为止;用循环语句实现,结束条件是当前值不为用循环语句实现,结束条件是当前值不为0。例例3.2 子函数子函数/Example 6.2:/Example 6.2:复制字符串复制字符串mystrcpymystrcpy(char(char*destin*destin,char*source),char*source)while(*source!=0)while(*source!=0)*destin*destin=*source;=*source;source+;source+;destindestin+;+;*destin*destin=0;=0;例例3.2 主函数主函数/*-/*-用于调试函数用于调试函数 mystrcpymystrcpy()()的主函数的主函数 -*/-*/#include#include main()main()char s181;char s181;char s2=This is a sample.;char s2=This is a sample.;mystrcpy(s1,s2);mystrcpy(s1,s2);coutcoutThe result is:The result is:”s1s1endlendl;例例3.3 3.3 数组清零数组清零v算法分析(用指针实现)算法分析(用指针实现)令指针指向数组首地址令指针指向数组首地址向当前地址赋向当前地址赋0值值指针指针+重复重复、直到整个数组处理完毕为止;直到整个数组处理完毕为止;用循环语句实现,结束条件是循环用循环语句实现,结束条件是循环N次,次,N是数组的是数组的元素个数。元素个数。例例3.4 数组清零数组清零void clear_array(float*ptr,int len)float*qtr=ptr+len;while(ptrqtr)*ptr=0.0;ptr+;指针与多维数组指针与多维数组#includevoid main()int a33=1,2,3,4,5,6,7,8,9,i,j,*p;for(i=0;i3;i+)for(j=0;j3;j+)p=&a00+i*3+j;cout*p ;coutendl;指针与多维数组指针与多维数组#includevoid main()int a33=1,2,3,4,5,6,7,8,9,i,j,*p;for(i=0;i3;i+)for(j=0;j3;j+)p=a0+i*3+j;cout*p ;coutendl;3.4 动态存储分配动态存储分配v运算符运算符new用来申请所需的内存用来申请所需的内存=new();也可以为数组申请内存:也可以为数组申请内存:=new;v运算符运算符delete用于释放先前申请到的存储块用于释放先前申请到的存储块delete;v若要释放数组的空间,必须放一个空的方括号若要释放数组的空间,必须放一个空的方括号在在操作符操作符delete和指向该类对象数组的指针之间。和指向该类对象数组的指针之间。int*p=new int size;deletep;例例3.4 利用动态数组来求斐波那挈利用动态数组来求斐波那挈数列的前数列的前n项项/Example 6.4:用动态数组来求斐波那挈数列的前:用动态数组来求斐波那挈数列的前n项项#include void main()int*p,n;coutn;p=new intn+1;if(p=0|n=0)return;/如果没有申请到内存或数据输入有误,则返回如果没有申请到内存或数据输入有误,则返回p0=0;p1=1;coutp0endl;coutp1endl;for(int i=2;i=n;i+)pi=pi-2+pi-1;coutpiendl;delete p;动态创建多维数组动态创建多维数组void main()int m=3,n=4,*a;a=new int*m;for(int i=0;im;i+)ai=new int n;for(i=0;im;i+)for(int j=0;jn;j+)aij=(i+1)*10+(j+1);for(i=0;im;i+)for(int j=0;jn;j+)coutaij ;cout=1&n=1&n=12)?monthn:month0;例例3-5主函数主函数void main()void main()coutcoutendlendl;coutcoutmonth_name(3);month_name(3);coutcout“15,2000 15,2000”;指向函数的指针指向函数的指针v说明格式说明格式 (*)();v例:例:double(*func)(double x)=sin;/说明一个指向函数的指针说明一个指向函数的指针double y,x;/说明两个双精度类型的变量说明两个双精度类型的变量x=.;/计算自变量计算自变量x的值的值y=(*func)(x);/通过指针调用库函数求通过指针调用库函数求x的正弦的正弦例:一般形式例:一般形式v#include vint max(int x,int y)v return xy?x:y;v vvoid main()v int a=5,b=3;v coutmax=max(a,b)endl;v例:指针形式例:指针形式v#include vint max(int x,int y)v return xy?x:y;vvint max(int x,int y);vvoid main()v int a=5,b=3;v int(*p)(int x,int y)=max;v coutmax=(*p)(a,b)endl;v调试技术:Visual C+的帮助功能的帮助功能 图6.7 MSDN界面程序设计举例v例例3-8 计算计算50的阶乘。的阶乘。算法算法 求求阶阶乘乘n!,当当n较较大大时时,由由于于计计算算机机字字长长有有限限,不不能能直直接接机机算算,可可采采用用数数组组的的方方法法来来实实现现。每每个个数数组组存存放放一一位位数数字字,假假如如我我们们用用有有100个个元元素素的的数数组组来来计计算算,则则精精度度可可达达100位位,用用这这种种方方法法就就可可以以计算出计算出n=50时的阶乘值。时的阶乘值。例例3-9 编写一个字符串比较函数编写一个字符串比较函数 v算法算法int mystrnicmp(char*str1,char*str2,int n)v例例5-115-11介绍了字符串比较函数介绍了字符串比较函数mystrcmpmystrcmp()()的编写的编写方法,但那时我们是通过下标对数组进行操作。方法,但那时我们是通过下标对数组进行操作。其实,使用指针处理这类操作会更加方便。为了其实,使用指针处理这类操作会更加方便。为了达到在比较时不区分大小写字母的目的,可以使达到在比较时不区分大小写字母的目的,可以使用库函数用库函数touppertoupper()(),其原型为,其原型为:vintint touppertoupper(intint c);c);v其中参数其中参数c c为待转换的为待转换的ASCIIASCII代码,如果代码,如果c c是一个小是一个小写字母,则该函数返回与其对应的大写字母。写字母,则该函数返回与其对应的大写字母。上机练习题目上机练习题目1 1编一程序,将字符串编一程序,将字符串“Hello,C+Hello,C+!”赋给一个字符数组,然赋给一个字符数组,然后从第一个字母开始间隔地输出该串(请用指针完成)。后从第一个字母开始间隔地输出该串(请用指针完成)。2 2编写程序,把编写程序,把1010个浮点小数个浮点小数1.01.0、2.02.0、1.01.0赋予某个赋予某个doubletdoublet型数组,然后用型数组,然后用doubledouble型指针输出该数组元素的值。型指针输出该数组元素的值。3 3编写一个函数,用于生成一个空字符串,其原型为编写一个函数,用于生成一个空字符串,其原型为:char char*mystrspc*mystrspc(char*string,(char*string,intint n);n);其中参数其中参数stringstring为字符串为字符串,n,n为空白字符串的长度为空白字符串的长度 (空格符的个数空格符的个数)。返回值为指向。返回值为指向stringstring的指针。的指针。4 4编写一个函数,用于去掉字符串尾部的空格符,其原型为编写一个函数,用于去掉字符串尾部的空格符,其原型为:char char*mytrim*mytrim(char*string);(char*string);其中参数其中参数stringstring为字符串,返回值为指向为字符串,返回值为指向stringstring的指针。的指针。5 5编写一个函数,用于去掉字符串前面的空格,其原型为编写一个函数,用于去掉字符串前面的空格,其原型为:char char*myltrim*myltrim(char*string);(char*string);其中参数其中参数stringstring为字符串,返回值为指向为字符串,返回值为指向stringstring的指针。的指针。结结束束语语v学好程序设计语言的唯一途径是学好程序设计语言的唯一途径是 上机练习。上机练习。v你的编程能力与你在计算机上投入的时间成你的编程能力与你在计算机上投入的时间成 正比。正比。例例3-6 通用数值积分函数通用数值积分函数#include#include double integral(double a,double b,double(*fun)(double x),int n)double h =(b-a)/n;double sum=(*fun)(a)+(*fun)(b)/2;int i;for(i=1;in;i+)sum+=(*fun)(a+i*h);sum*=h;return sum;通用数值积分函数的主函数通用数值积分函数的主函数/用于调试函数用于调试函数 integral()的主函数的主函数 double func(double x)return sin(x)+x;void main()double sum;sum=integral(0.0,1.0,func,1000);coutThe Integral of sin(x)+x,0,1 is”sum;

    注意事项

    本文(C++第3章指针.ppt)为本站会员(s****8)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开