




已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章指针(一),C语言程序设计,内容提要,指针概述指针的概念为什么引入指针的概念指针变量作为函数参数字符指针作为函数参数指针和数组间的关系一维数组的地址和指针二维数组的地址和指针,为什么引入指针的概念,铁杆C/C+程序员最挚爱的武器:指针C/C+的高效、高能主要来自于指针很多不可能的任务由指针完成,为什么引入指针的概念,指针为函数提供修改变量值的手段为C的动态内存分配系统提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持可以改善某些子程序的效率,内存的寻址方式,如何读写内存中的数据?通过变量的地址访问变量所在的存储单元两种寻址方式直接(寻址)访问通过变量地址直接存取变量内容间接(寻址)访问通过指针变量来间接存取它所指向的变量i_pointer=,指针(Pointer)的概念,指针也是一种数据类型指针变量声明为指针类型的变量,专门存放地址数据的变量,如何定义指针变量?,定义指针变量int*p;定义了一个指针变量p,简称指针pp是变量,int*是类型指针变量初始化int*p,a;p=*p与a完全等价,inti,*p;p=,int*p;float*q;p=q;,inti;float*p;p=,int*p;p=100;,判断是真?是假?,指针变量只存放地址!,一个指针变量不能指向与其类型不同的变量!,我是真的,你猜对了吗?,应在类型相同的指针变量之间赋值,p=,inti=3,*p;p=,指针变量与其它类型变量的对比,共性在内存中占据一定大小的存储单元先定义,后使用特殊性它的内容只能是地址,而不能是数据必须初始化后才能使用,否则指向不确定的存储单元,对该空间进行访问,将可能造成危险可参与的运算:加、减一个整数,自增、自减、关系、赋值只能指向同一基类型的变量,指针的指向,只能指向同一基类型的变量,否则将引起warningfloatx;int*p=TC编译warning:SuspiciouspointerconversioninfunctionmainVC编译warningC4133:=:incompatibletypes-fromfloat*toint*,指针运算,算术运算short*p,a10;p=a;p+;/*p的值增加多少?*/指针的加减运算是以其指向的类型的字节长度为单位的,6000600160026003600460056006,指针运算,int*p,*q,a10;p=a;q=指针运算不能乱算一般只进行指针和整数的加减运算,同类型指针之间的减法运算其它运算,比如乘法、除法、浮点运算、指针之间的加法等,并无意义,所以也不支持,指针运算,关系运算指向同一种数据类型的两个指针才能进行关系运算值为1或0pqpqp=q不能与非指针类型变量进行比较,但可与NULL(即0值)进行等或不等的关系运算判断p是否为空指针P=NULLp!=NULL,指针运算,赋值运算指针在使用前一定要赋值为指针变量赋的值必须是一个地址,main()int*p;scanf(%d,p);,main()inta,*p=,错!但TC下不报错VC下报错,指针与函数,指针既然是数据类型,自然可以做函数参数和返回值的类型指针做函数参数的经典例子:两数的互换,voidSwap(int*x,int*y)inttemp;temp=*x;*x=*y;*y=temp;,main()inta,b;a=15;b=8;Swap(,voidSwap(intx,inty)inttemp;temp=x;x=y;y=temp;,main()inta,b;a=15;b=8;Swap(a,b);printf(a=%d,b=%d,a,b);,程序1,程序2,例7.17.2:编写函数实现两数的互换,实参,形参,结果有何不同?,NotWork!Why?,主调函数,被调函数,main()inta,b;a=15;b=8;Swap(a,b);printf(a=%d,b=%d,a,b);,voidSwap(intx,inty)inttemp;temp=x;x=y;y=temp;,5,5,a,b,实参,形参,9,9,程序1,x,y,5,5,temp,9,主调函数,被调函数,main()inta,b;a=15;b=8;Swap(,voidSwap(int*x,int*y)inttemp;temp=*x;*x=*y;*y=temp;,temp=x;/*x,y为内部变量*/x=y;y=temp;,swap函数的几种错误形式(2/3),参数单向传递voidSwap(int*p1,int*p2)int*p;p=p1;/*p1,p2为内部变量*/p1=p2;p2=p;,swap函数的几种错误形式(3/3),指针p没有确切地址voidSwap(int*p1,int*p2)int*p;/*指针p未初始化*/*p=*p1;*p1=*p2;*p2=*p;,字符串与字符数组、字符指针,C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理字符串一串以0结尾的字符字符数组每个元素都是字符类型的数组charstring100;字符指针指向字符类型的指针char*p;数组和指针可以等同看待,上面三者本质上是一回事,字符指针变量与字符数组的区别,定义方法不同charstr10;char*ptr;赋值方法不同charstr10;str=”china”;/*错误*/strcpy(str,”china”);/*正确*/char*ptr;ptr=”china”;字符指针是变量,而数组名是地址常量,使用字符指针的注意事项,字符指针变量必须有明确的指向,否则使用是危险的例如,输入字符串时char*a;scanf(%s,a);/*错误*/应为:char*a;charstr10;a=str;scanf(%s,a);/*正确*/,例7.5:字符串拷贝用字符数组编程,voidMyStrcpy(chardstStr,charsrcStr)inti=0;while(srcStri!=0)dstStri=srcStri;i+;dstStri=0;,voidMyStrcpy(char*dstStr,constchar*srcStr)while(*srcStr!=0)*dstStr=*srcStr;srcStr+;dstStr+;*dstStr=0;,当只允许函数访问地址内容,不允许修改时,可以把函数的指针参数定义为const,例7.5:字符串拷贝用字符指针编程,例7.5:字符串拷贝主函数程序,#includemain()chara80,b80;printf(“Pleaseenterastring:”);gets(a);MyStrcpy(b,a);printf(“Thecopyis:”);puts(b);,例7.6:计算实际字符个数,unsignedintMyStrlen(charstr)inti;unsignedintlen=0;for(i=0;stri!=0;i+)len+;return(len);,unsignedintMyStrlen(char*pStr)unsignedintlen=0;for(;*pStr!=0;pStr+)len+;return(len);,方法2:用字符指针实现,方法1:用字符数组实现,指针与数组,数组名就是一个指针只是不能修改这个指针的指向可以定义函数的参数为数组指针也可当作数组名使用short*p,a10;p=a;数组元素的几种等价引用形式ai*(a+i)pi*(p+i),60006001600260036004600560066007,a,a+1,a+2,60006001600260036004600560066007,a,p+,p+,输入输出数组的全部元素,main()inta10;inti;for(i=0;i10;i+)scanf(%d,方法1:下标法,main()inta10;int*p,i;for(p=a;p=pos;i-)*(a+i+1)=*(a+i);/*向后移动*/*(a+pos)=x;/*插入元素x到位置pos*/,指针与二维数组,C语言将二维数组看作一维数组,其每个数组元素又是一个一维数组按行顺序存放所有元素,aa0+0,a+1a1+0,a0+1,a0+2,例7.8,任意输入英文的星期几,在查找星期表后输出其对应的数字。charweekDay710=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;,表7-1星期表的内容,#includemain()inti,pos;intfindFlag=0;charx10;charweekDay10=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;printf(Pleaseenterastring:);scanf(%s,x);for(i=0;i7,例7.8,指针与二维数组,a代表二维数组的首地址,第0行的地址a+i代表第i行的地址*(a+i)即ai代表第i行第0列的地址*(a+i)+j即ai+j代表第i行第j列的地址*(*(a+i)+j)即aij代表第i行第j列的元素,行地址转变成列地址,指针与二维数组,二维数组的指针列指针int*p;p=*a;/用列地址初始化逐个元素查找元素所在位置相对于数组起始地址的偏移量i*n+jfor(i=0;im;i+)for(j=0;jn;j+)printf(%d,*(p+i*n+j);,p,p+,指针与二维数组,二维数组的指针行指针int(*p)3,a43,*p1;p=a;/用行地址初始化p1=a0;/用元素地址初始化先逐行查找元素所在行再在行内逐列查找元素所在位置for(i=0;im;i+)for(j=0;jn;j+)printf(%d,*(*(p+i)+j);,p,p+,例7.3:在一个班级中找出最高分及其学号,voidFindMax(floatscore,longnum,intn,floatpMaxScore,longpMaxNum)inti;pMaxScore=score0;pMaxNum=num0;for(i=1;ipMaxScore)pMaxScore=scorei;pMaxNum=numi;,能返回这两个值吗?,例7.3:在一个班级中找出最高分及其学号,voidFindMax(floatscore,longnum,intn,float*pMaxScore,long*pMaxNum)inti;*pMaxScore=score0;*pMaxNum=num0;for(i=1;i*pMaxScore)*pMaxScore=scorei;*pMaxNum=numi;,指针参数指定了存放这两个值的地址,例7.9:在多个班级中找出最高分及其所在班级和学号,intFindMax(intpmn,intm,intn,int*pRow,int*pCol)inti,j,max;max=p00;*pRow=0;*pCol=0;for(i=0;imax)max=pij;*pRow=i;*pCol=j;return(max);,能这样传递m个班(每班n个学生)的成绩吗?,intFindMax(int*p,intm,intn,int*pRow,int*pCol)inti,j,max;max=p0;*pRow=0;*pCol=0;for
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 执业药师之《药事管理与法规》题库检测试题打印及答案详解【基础+提升】
- 2025自考公共课能力检测试卷【重点】附答案详解
- 2022电力工程概论
- 2025年广西崇左市辅警考试题库(附答案)
- 2025年福建省漳州市辅警人员招聘考试题库及答案
- 2025年甘肃工业职业技术学院引进博士研究生15人笔试备考题库带答案详解
- 2023年度自考专业(公共关系)综合提升测试卷及完整答案详解【夺冠系列】
- 2025辽宁沈阳高瑞知识产权运营有限公司招聘笔试模拟试题及答案详解(必刷)
- 2025年四川省矿业投资集团有限责任公司人员招聘笔试备考题库含答案详解(轻巧夺冠)
- 2024年西安市公务员行测带答案详解(轻巧夺冠)
- 青少年无人机课程大纲
- 2025-2030中国耳鼻喉外科手术导航系统行业市场发展趋势与前景展望战略研究报告
- 剪彩仪式方案超详细流程
- 2024年二级建造师考试《矿业工程管理与实物》真题及答案
- 人教版初中九年级化学上册第七单元课题1燃料的燃烧第2课时易燃物和易爆物的安全知识合理调控化学反应课件
- 发电厂继电保护培训课件
- 校企“双元”合作探索开发轨道交通新型活页式、工作手册式教材
- 肺癌全程管理
- 2024年考研英语核心词汇
- 信息系统定期安全检查检查表和安全检查报告
- 颅脑外伤患者的麻醉管理专家共识(2021版)
评论
0/150
提交评论