欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    第7章指针ppt课件.ppt

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

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

    第7章指针ppt课件.ppt

    第7章 指 针,C语言程序设计-第7章 指针,2,目 录,指针概念指针变量和指针运算指向数组的指针指向字符串的指针指向函数的指针返回指针值的函数指针数组和指向指针的指针,C语言程序设计-第7章 指针,3,指针(Pointer),指针表示变量等的存储地址使用指针可以获得紧凑、高效的代码使用指针也可能使程序晦涩难懂指针的使用灵活方便指针操作容易出错且难以调试指针与数组关系密切,C语言程序设计-第7章 指针,4,指针与地址,地址通过首地址和数据类型可以访问内存中某一数据数据类型决定所占用存储单元数指针就是地址和类型有关,C语言程序设计-第7章 指针,5,指针变量和指针运算,变量的指针和指针变量指针变量的定义地址运算符和指针运算符指针变量的引用指针的运算,C语言程序设计-第7章 指针,6,变量的指针和指针变量,变量的指针内存中存储某个变量的存储单元的首地址指针(地址)实质上是一个整数(不是C的整型)可以通过变量的地址来间接的访问变量指针变量指针(地址)是一个数据,也可以用另一个变量来存放,即指针变量通过指针变量可以间接访问变量或内存数据,C语言程序设计-第7章 指针,7,指针变量的定义,一般形式基类型*指针变量名;说明“基类型”表示该指针指向的数据的类型可以定义基类型为空类型void的指针变量举例int*pi;char*pc1,c,*pc2;void*p;,C语言程序设计-第7章 指针,8,地址运算符(Address Operator),地址运算符,C语言程序设计-第7章 指针,9,指针运算符(Indirection Operator),指针运算符*获得指针指向的内存数据又称“间接访问运算符”单目运算符,自右向左结合,优先级较高操作数为具有指针(地址)意义的值举例int i,*p=*/,C语言程序设计-第7章 指针,10,指针变量的引用,指针变量也要“先赋值,后使用”没有赋值的指针变量所存储的地址数据是不确定的,对它的引用非常危险对指针的赋值要注意类型匹配,必要时可以使用强制类型转换,但要慎重使用*p可以用于与指针p的基类型相同类型的变量可以使用的任何场合指针变量可以作为函数的参数,C语言程序设计-第7章 指针,11,指针变量引用举例(07-01.C),int a,b,c,*pa,*pb,*pc;pa=/*c=34*/,C语言程序设计-第7章 指针,12,指针变量与所指变量的关系,10,20,pa,pb,a,b,int a,b;int*pa,*pb;,pa=,*pa=10;b=20;,pa=pb;,pb=,&a,&*pa,*pa,*&a,C语言程序设计-第7章 指针,13,指针变量作为函数参数,参数传递仍然遵循“单向值传递”的规则这里的传递规则是指针类型参数的值的传递作为参数的指针型实参的值不会改变但是对指针型实参所指向的内存数据所作的操作将不会随函数的返回而恢复用途借助指针类型参数可以改变多个数据的值,C语言程序设计-第7章 指针,14,指针类型函数参数举例(07-02.C),void swap(int*x,int*y)int t;t=*x,*x=*y,*y=t;void main()int a=1,b=4;int*pa,*pb;pa=,&a,a,&b,pb,1,4,4,1,b,pa,&a,&b,y,x,参数传递,C语言程序设计-第7章 指针,15,指针的运算,运算类型算术运算:加、减、自增、自减关系运算:所有关系运算赋值运算:一般赋值、加赋值、减赋值上述运算在一定约束条件下才有意义(后详)变量说明p,q是同类型的指针变量n是整型变量,C语言程序设计-第7章 指针,16,指针的算术运算,条件:p,q是指向同一数据集合(数组)的指针注意避免数组越界,C语言程序设计-第7章 指针,17,指针的关系运算,条件p,q是指向同一数据集合(数组)的指针运算方式p=q、pqpq:判断p所指元素是否在q所指元素之前其他运算的含义与上述类似若p,q不是指向同一数据集合的指针,则运算无意义,C语言程序设计-第7章 指针,18,指针的赋值运算,条件p,q是指向同一数据类型的指针n是整型数据有意义的赋值方式p=qp=q+n、p=q-n(要求q指向数组)p+=n、p-=n(要求p指向数组)注意避免数组越界,C语言程序设计-第7章 指针,19,指针的运算说明,指针的运算还包括指针运算对指向数组的指针的下标运算对指针变量的取地址运算对指向结构体的指针的指向成员运算除上述运算方式(包括约束条件)外的其他运算都没有意义无意义的指针运算不一定会出现语法错误,但可能造成危险的操作,C语言程序设计-第7章 指针,20,指针的运算举例,short a5,*p,*q;p=,C语言程序设计-第7章 指针,21,指向数组的指针,指针与数组的关系指向数组的指针通过指针引用数组元素数组用作函数参数指向二维数组的指针,C语言程序设计-第7章 指针,22,指针与数组的关系,数组名是“常量指针”数组名表示数组的首地址,因此数组名也是一种指针(地址)数组名表示的地址(指针)不能被修改,所以称之为“常量指针”数组的指针数组的起始地址与数组名表示的指针相同与数组的第一个元素(a0)的地址相同,C语言程序设计-第7章 指针,23,数组和指针的用法,数组名不能被赋值和修改,若指针指向数组,则两者的其他用法基本相同定义指针时,只分配一段用来存放地址的空间,而没有分配存放数据的空间定义数组时,为所有元素分配相应的连续的存储空间,但没有存放地址的空间指针应赋值后才能使用数组名不能被赋值,可以直接使用,C语言程序设计-第7章 指针,24,指向数组的指针,char a10,*p;p=,a,p,&a0,C语言程序设计-第7章 指针,25,通过指针引用数组元素,当一个指针变量指向数组或某个数组元素时,可以通过这个指针变量引用所有的数组元素引用数组元素的方法下标运算符,例如ai、pi指针运算符*,例如*(a+i)、*(p+i)注意数组名不能被修改和赋值注意防止下标越界,C语言程序设计-第7章 指针,26,通过指针引用数组元素图示,p0,*p,*a,p,a,p+1,a+1,p1,*(p+1),*(a+1),q+i-2,p+i,a+i,pi,*(p+i),*(a+i)qi-2,*(q+i-2),p+9,a+9,p9,*(p+9),*(a+9),q,p+2,a+2,p2,*(p+2),*(a+2)q0,*q,C语言程序设计-第7章 指针,27,数组名和指针引用数组元素比较(1),指针指向数组首地址前提条件:int a10,*p=a;ai、pi、*(a+i)、*(p+i)等用法都是合法的,且它们都表示同一个数组元素a+i(或p+i)不是简单的在a(或p)表示的地址值上简单的加i,而是加上i个基类型所需的地址偏移量,即加上i*sizeof(int)指针值可以改变,如p+为下一元素的地址数组名的值不能修改,如a+是非法操作,C语言程序设计-第7章 指针,28,数组名和指针引用数组元素比较(2),指针指向某个数组元素前提条件:p=a+i;*(p+)与ai+等价*(p-)与ai-等价*(+p)与a+i等价*(-p)与a-i等价注意不能使用*(a+)或a=p+i这种形式注意区分运算顺序,*(p+)与(*p)+注意防止下标越界,注意掌握指针位置,C语言程序设计-第7章 指针,29,通过指针引用数组元素举例,int a10,i,*p;p=a;/*指针需要先赋值*/while(pa+10)/*指针在数组范围内移动*/scanf(%d,p+);/*指针向下移动*/p=a;/*指针指向正确位置*/for(i=0;i10;i+)printf(%d,pi);/*指针使用*/,C语言程序设计-第7章 指针,30,数组用作函数参数,数组元素用作函数实参与同类型的一般变量用法相同数组用作函数参数数组类型可以作为函数参数类型数组可以用作函数的形参和实参定义函数时,数组型形参实际上作为指针型形参处理,实参可用相同类型的数组或指针声明数组类型形参时,不需要指定数组长度一般应把数组长度作为另一个参数传递,C语言程序设计-第7章 指针,31,以数组作为实参的几种方法(1),形参用数组名实参用数组名,形参用指针变量实参用数组名,f(int x,int n).main()int a10;.f(a,10);,f(int*x,int n).main()int a10;.f(a,10);,C语言程序设计-第7章 指针,32,以数组作为实参的几种方法(2),形参用数组名实参用指针变量,形参用指针变量实参用指针变量,f(int x,int n).main()int a10,*p=a;.f(p,10);,f(int*x,int n).main()int a10,*p=a;.f(p,10);,C语言程序设计-第7章 指针,33,数组用作函数参数举例,选择排序法,C语言程序设计-第7章 指针,34,例1:选择排序法(07-03.C),void sort(int x,int n)/*int*x*/int i,j,k,t;for(i=0;ixk)k=j;if(k!=i)t=xi,xi=xk,xk=t;,C语言程序设计-第7章 指针,35,例1:选择排序法(续),void main()int a10,*p,i;p=a;for(i=0;i10;i+)scanf(%d,p+);p=a;sort(p,10);/*sort(a,10);*/for(p=a,i=0;i10;i+)printf(%d,*p+);,C语言程序设计-第7章 指针,36,指向二维数组的指针(1),char a34;,*a,*(a+1),*(a+2),a、a+1、a+2都是指针,它们的基类型是长度为4的字符数组,它们与下面定义的指针p同类型char(*p)4;,C语言程序设计-第7章 指针,37,指向二维数组的指针(2),a0,a1,a2,a13*(*(a+1)+3),a23*(*(a+2)+3),a03*(*a+3),char*,char,char*,基类型为char4的指针,C语言程序设计-第7章 指针,38,指向二维数组的指针总结,表示二维数组a:指向二维数组的指针类型表示第i行ai、*(a+i):指向一维数组的指针类型表示第i行j列的元素aij、*(*(a+i)+j)*(ai+j)、(*(a+i)j:char类型注意a和*a都是指针,但是基类型不同注意*(a+i)和*a+i的区别,C语言程序设计-第7章 指针,39,指向二维数组的指针变量,指向数组元素的指针变量指向二维数组的元素类型为 char*p;根据一维数组元素和二维数组元素的对应关系,可以访问所有的二维数组元素基类型为一维数组的指针变量指向二维数组的行类型为 char(*p)4;把每一行作为一个一维数组来处理,C语言程序设计-第7章 指针,40,指向二维数组元素的指针变量,一维数组与二维数组char aMN;char aM*N;aij ai*N+j使用指向元素的指针访问二维数组元素char aMN;char*p=a0;/*p=*a;*/则pi*N+j、*(p+i*N+j)、aij表示二维数组第i行j列的元素,C语言程序设计-第7章 指针,41,指向二维数组的行的指针变量,二维数组是基类型为一维数组的指针可以使用与二维数组同类型的指针变量使用指向行的指针访问二维数组元素int aMN;int(*p)N=a;/*p=a;*/则pi、*(p+i)、ai表示数组的第i行且pij、*(*(p+i)+j)、*(pi+j)、(*(p+i)j表示二维数组第i行j列的元素,C语言程序设计-第7章 指针,42,二维数组的指针作函数参数,二维数组的地址也可以用作函数参数用指向数组元素的指针作为参数用指向二维数组的行的指针作为参数举例,void foo(int*p,int n);void bar(int(*p)4,int n);int a34;/*定义二维数组*/foo(*a,12);/*二维数组的行作为参数*/bar(a,3);/*二维数组名作为参数*/,C语言程序设计-第7章 指针,43,指向字符串的指针,指针指向存放字符串的字符数组与前述“指向数组的指针”类似直接用字符指针指向字符串字符串常量按字符数组处理,在存储器中占有一定的空间,并有自己的地址(指针)可以把字符串常量的地址赋给字符指针变量通过这个字符指针变量可以修改字符串常量两个内容完全一样的字符串常量,在存储器中是不同的字符串,具有不同的存储空间,C语言程序设计-第7章 指针,44,直接用字符指针指向字符串,可以用字符指针直接指向字符串常量可以用字符串常量对字符指针直接赋值这是把字符串常量的地址赋给字符指针而不是把字符串的内容赋给字符指针使用字符指针可以修改字符串的内容只有利用指针才能再次访问某字符串常量注意防止越过原字符串常量的范围注意字符串末尾应保留结束标志0,C语言程序设计-第7章 指针,45,字符串指针举例,char*s=I love;char*t;t=China!;s0=U;puts(s);/*U love*/s6=;puts(s);/*U loveChina!*/s12=;puts(t);/*China*/,s0,s6,s12,U,C语言程序设计-第7章 指针,46,字符串指针作函数参数举例,void strcpy(char*s,char*t)while(*t+=*s+);/*逐个字符复制*/void main()char*str1=C Language,str220;strcpy(str1,str2);puts(str2);/*C Language*/,C语言程序设计-第7章 指针,47,字符数组和字符指针变量比较(1),定义char astr=Hello,World!;char*pstr=Hello,World!;数组在定义时分配存放若干字符的空间指针定义时只分配存放一个地址的空间,Hello,World!0,astr:,C语言程序设计-第7章 指针,48,字符数组和字符指针变量比较(2),数组可以直接使用指针要先指向一个字符串后才能使用字符串常量只能对数组赋初值,把字符串的各个字符放到数组中,并且不能在其他场合对数组整体赋值指针可以用字符串常量或字符数组任意赋值,但只是把字符串的地址赋给指针数组名的值不能修改指针可以任意修改,C语言程序设计-第7章 指针,49,指向函数的指针,函数的指令存储在内存中的一段空间中函数也有相应的内存地址函数的入口地址就是函数的指针函数名代表函数的入口地址函数的指针可以用相应类型的指针变量表示,即指向函数的指针变量函数也可以用通过指针变量间接调用,C语言程序设计-第7章 指针,50,指向函数的指针变量,定义形式类型(*变量名)(参数类型列表);说明与函数原型类似,函数名用(*变量名)代替“参数类型列表”可以省略,但一般不要省略主要用于函数的参数先赋值,后使用,一般用同类型函数名赋值不能进行算术运算和关系运算,C语言程序设计-第7章 指针,51,指向函数的指针变量使用举例,int max(int x,int y)return xy?x:y;void main()int(*p)(int,int);/*定义指针变量*/int a,b,c;scanf(%d%d,*/,C语言程序设计-第7章 指针,52,指向函数的指针用作函数参数举例,一元函数定积分的梯形法数值求解,C语言程序设计-第7章 指针,53,例:一元函数定积分(07-04.C),double integral(double(*f)(double),double a,double b)double s,h;int n=100,i;h=(b-a)/n;s=(*f)(a)+(*f)(b)/2.0;for(i=1;in;i+)s+=(*f)(a+i*h);return s*h;,C语言程序设计-第7章 指针,54,例:一元函数定积分(续),#include#include void main()double y1,y2,y3;y1=integral(sin,0.0,1.0);y2=integral(cos,0.0,2.0);y3=integral(exp,0.0,3.5);printf(%lfn%lfn%lfn,y1,y2,y3);,C语言程序设计-第7章 指针,55,返回指针值的函数,函数的返回值可以是指针类型定义形式类型*函数名(参数列表);举例int*foo(int x,int y);说明函数调用可以结合使用*和运算符注意与指向函数的指针区别int(*foo)(int x,int y);,C语言程序设计-第7章 指针,56,返回指针值的函数举例(1),int*f(int*px,int*py)/*返回整型指针*/return*px*py?px:py;/*较大数的地址*/void main()int a=2,b=3,c=9;*f(/*输出9*/,C语言程序设计-第7章 指针,57,返回指针值的函数举例(2),int*f(int*a,int*b)/*返回整型指针*/return*a*b?a:b;/*返回第一个元素*/*较大的数组地址*/void main()int i,a=1,2,3,4,b=5,6,7,8;for(i=0;i4;i+)printf(%dn,f(a,b)i);/*打印数组b的元素*/,C语言程序设计-第7章 指针,58,指针数组和指向指针的指针,指针数组类型*数组名长度;元素是指针类型的数组举例,char*p4;注意与基类型为数组的指针区分char(*p)4;指向指针的指针基类型为指针类型的指针举例,char*p;,C语言程序设计-第7章 指针,59,指针数组举例,/*把所有名字的所有字母全部改成大写*/void main()char*name=Tom,John,Kate;int i,j;for(i=0;i=a,C语言程序设计-第7章 指针,60,指向指针的指针举例,/*利用指向字符指针的指针打印字符串数组*/void main()char*name=Tom,John,Kate;char*p;int i;p=name;for(i=0;i3;i+)printf(%sn,*p+);,C语言程序设计-第7章 指针,61,命令行参数,main函数的几种形式int main();int main(int argc,char*argv);int main(int argc,char*argv);说明返回值类型一般为int,也可以是其他类型argc为命令行参数的个数argv为命令行参数字符串数组命令行参数包括文件名本身,C语言程序设计-第7章 指针,62,命令行参数举例echo命令,echo C Languageargc=3;argv0=echo;argv1=C;argv2=Language;,#include int main(int argc,char*argv)while(-argc 0)printf(%s%c,*+argv,(argc1)?:n);return 0;,C语言程序设计-第7章 指针,63,复杂的声明形式,复杂类型变量的声明容易混淆指针数组和指向数组的指针int*a5;int(*a)5;指向函数的指针和返回指针值的函数void(*f)();void*f();过于复杂的声明形式使程序晦涩难懂,而且容易出错可以用typedef关键字把复杂类型的变量声明用若干个容易理解的小步骤表示,C语言程序设计-第7章 指针,64,分析声明形式的方法,从标识符开始,逐层分析其意义按运算符优先级和结合方向的顺序进行可能涉及的运算符包括()自左向右结合改变结合顺序;或声明一个函数,向外一层是函数返回值类型声明自左向右结合声明一个数组,向外一层是数组元素类型声明*自右向左结合声明一个指针类型,向外一层是指针基类型声明,C语言程序设计-第7章 指针,65,声明形式分析举例,char(*(*x3)()5;,x is an array3 of pointer to functionreturning pointer to array5 of char,C语言程序设计-第7章 指针,66,void类型指针,定义形式void*p;说明定义一个指针,但不指定它指向的数据类型不能通过*p引用它指向的数据void*指针可以与其他任何类型的指针相互赋值和比较,而不需要显式的强制类型转换经常作为函数形参和返回值的类型,C语言程序设计-第7章 指针,67,结束,The End,

    注意事项

    本文(第7章指针ppt课件.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开