c精品课件昆明理工大学A第七章指针

上传人:E**** 文档编号:91225709 上传时间:2019-06-26 格式:PPT 页数:42 大小:409.50KB
返回 下载 相关 举报
c精品课件昆明理工大学A第七章指针_第1页
第1页 / 共42页
c精品课件昆明理工大学A第七章指针_第2页
第2页 / 共42页
c精品课件昆明理工大学A第七章指针_第3页
第3页 / 共42页
c精品课件昆明理工大学A第七章指针_第4页
第4页 / 共42页
c精品课件昆明理工大学A第七章指针_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《c精品课件昆明理工大学A第七章指针》由会员分享,可在线阅读,更多相关《c精品课件昆明理工大学A第七章指针(42页珍藏版)》请在金锄头文库上搜索。

1、研究式学习C程序设计(第七章),1,第七章,指针,研究式学习C程序设计(第七章),2,主要内容,内存地址及数据的存取方式 指针的定义及运算 指向数组的指针 指针操作字符串 用指针实现数据的动态管理,研究式学习C程序设计(第七章),3,内存地址,计算机的内存储器就象一个巨大的一维数组,每个数组元素就是一个存储单元 类似每个数组元素的下标,每个内存单元都有一个编号(无符号整数),称为该单元的地址 注意区分内存单元的地址与内存单元的值,内存空间 线性排列,58 6A,研究式学习C程序设计(第七章),4,存取数据的方法,在运行一个程序时,程序及其数据(程序、函数、变量、常量、数组等)都要放在内存储器中

2、 编译程序根据对象的数据类型,在内存中为其分配一个或多个连续的存储单元。 在编写程序时,通常是通过名字来使用一个变量或调用某个函数,而变量和函数的名字与其实际的存储地址之间的变换由编译程序自动完成,编译程序按变量名查找其地址,然后对该地址中的内容进行读写操作,研究式学习C程序设计(第七章),5,内存分配方式,单元地址 变量名(符号名) 变量类型 占用单元长度 规定运算操作 值的存放形式,研究式学习C程序设计(第七章),6,变量的访问形式,直接访问:变量名代表着该变量已分到的地址,对一般变量的存取就可以通过变量的地址(变量名)来进行。按变量地址存取变量值的方式称为直接访问。 间接访问:这种方式好

3、比我们要找到宝藏,必须先找到埋宝藏的地址,才能根据地址找到宝藏。,2000,若变量ip保存着变量i的地址,通过ip存取i的值就是间接访问。 要使用间接访问运算符 *,研究式学习C程序设计(第七章),7,指针作为函数参数实现多值返回具有其它类型数据所不具备的功能。 一、问题的提出 从键盘输入两个整数放到变量a、b中,编写子函数交换两个变量。 二、基本算法:该题要求通过子函数的调用实现向主调函数返回两个结果值的运算。 我们先尝试用普通变量的方法来编写:,引入指针的意义,研究式学习C程序设计(第七章),8,swap(p,q) int p,q; int temp; temp=p;p=q; q=temp

4、;return() /*只能返回一个值*/,指针的意义,main() int a,b; scanf(“%d,%d”,程序设计到这里就无法进行下去了,因为变量a、b作实参,只是将其值单向传递给形参p、q,在swap函数中只是交换了p、q的值,不会反方向影响a、b的值。要想得到结果值,要通过return语句进行返回,而C语言中被调函数只能向主函数返回一个值,故采用普通类型的变量作参数就无法将改变后的两个结果值都返回主函数。,研究式学习C程序设计(第七章),9,指针的意义,解决该问题的办法有两个: 一种简单的方法就是将其中的变量定义为全局变量,使其携带结果值返回。但全局变量一经定义,就从定义处开始在

5、整个程序执行过程中都都占用存储空间,直到程序结束。既浪费空间又不利于程序的模块化结构设计,不提倡。 另一种方法就是使用指针类型的数据作为函数的参数。C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式,指针变量作函数参数也要遵循这一规则。被调函数不能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。运用指针变量作参数,就能使被调函数和主函数在同一变量上操作,从而得到多个返回值。,研究式学习C程序设计(第七章),10,指针的意义,swap(int *p1,int *p2) int p; p=*p1; *p1=*p2; *p2=p;,main() int a,b; int *ma

6、x, *min; scanf(“%d,%d”,运行情况为: 1,8 8,1,实例:,例12.1,研究式学习C程序设计(第七章),11,指针作函数的参数,该程序中,实参max、min,形参p1、p2,都是指针变量,进行调用时,遵循“单向值传递”的原则,将max和min的值(变量a和b的地址)传递给p1和p2,使max和p1共同指向变量a ,min和p2共同指向变量b。,max,&a,a,1,min,&b,b,8,max,&a,a,1,min,&b,b,8,p1,&a,p2,&b,主函数中,参数传递(虚实结合),研究式学习C程序设计(第七章),12,指针作函数的参数,通过p1和p2的操作改变变量a

7、和b的值,达到改变多个变量值的目的。,max,&a,a,8,min,&b,b,1,max,&a,a,1,min,&b,p1,&a,p2,&b,调用实现交换,调用后回主函数(释放虚参),8,1,1,研究式学习C程序设计(第七章),13,指针的定义及运算,定义指针变量的语法格式为: 类型说明符 *指针变量名1,*指针变量名2,;,*表示变量为指针类型,以区别普通变量;“类型说明符”表示该指针变量所能指向的变量类型,可以是任何一种已有的数据类型。指针变量可以在定义的时候就进行初始化。 注意:任何变量都有三个要素:变量名、变量的值(包括上述的变量值和指针值)和变量类型,指针变量的类型是它所指向的变量的

8、类型,一个指针变量只能指向同一个类型的变量,研究式学习C程序设计(第七章),14,指针的定义及运算,1) 取地址运算符&,“ 则建立了指针变量fp1指向变量f1,指针变量fp2指向f2数组的首元素(相当于fp2=&f20)的指向关系。 ?f2是一个数组名,为什么能把一个数组名赋给一个指针变量呢?,研究式学习C程序设计(第七章),15,指针的定义及运算,1) 取地址运算符& 这是因为数组名是一个地址常量(即指针常量),它既是数组的起始地址,也是数组首元素的地址,所以有上述用法。 不同的对象,其地址的运算也有所区别: 变量的地址:取变量地址运算符 & 数组的地址:数组名(为数组第一个元素的地址),

9、由编 译系统确定,为常量。 函数的地址:函数名(为函数程序代码的入口地址),研究式学习C程序设计(第七章),16,指针的定义及运算,2)间接访问运算符* “*”是单目运算符,也被称为取值运算符。用在指针或已有确切指向的指针变量前,得到该指针所指向的变量值。它与“&”互为逆运算,同时出现时可抵消。 例如对1)中定义的变量f1,它的指针(地址)是&f1。 对&fp1作取值运算的表达式为*(&fp1),等效于直接访问fp1,得到变量f1的地址; 对fp1作取值运算的表达式为*fp1,等效于直接访问f1,得到变量f1的值2.5。,研究式学习C程序设计(第七章),17,指针的定义及运算,3)指针的赋值运

10、算 指针变量必须被赋以一个地址值,如: p= /* p1和p2都是指针变量,将p2的值赋给p1 */ 注意:不能把一个整数赋给指针变量。,研究式学习C程序设计(第七章),18,指针的定义及运算,main() char c1=a,c2=b,c3=c; float f1=90.0,f2=80.5,f3=70.0; char *pc=,例7.1,研究式学习C程序设计(第七章),19,指针的定义及运算,pc+;pf+; printf(“ ,程序运行结果: &c1=ffcf, c1=a, &f1=ffd2, f1=90.0 &c2=ffd0, c2=b, &f2=ffd6, f2=80.5 &c3=ff

11、d1, c3=c, &f3=ffda, f3=70.0,ffcf,ffd0,ffd1,ffd2,ffd6,ffda,研究式学习C程序设计(第七章),20,指向数组元素的指针,编译器在编译的时候就是将数组的下标转换成指针。因此,如果程序员想要提高自己所写的程序的效率以节省编译时间,可以直接使用指针编写数组下标。 定义与赋值 例: int a10; int *pa; pa= 通过指针引用数组元素 经过上述定义及赋值后: *pa就是a0,*(pa+1)就是a1,., *(pa+i)就是ai. ai, *(pa+i), *(a+i), pai都是等效的 不能写 a+,因为a是数组首地址是常量。,研究式

12、学习C程序设计(第七章),21,数组元素的访问,int a10, *p; p=a;,用数组:ai, &ai 用指针:*(p+i), p+i, p+ ,*(a+i),研究式学习C程序设计(第七章),22,数组与指针,用指针实现从键盘上输入一维数组的元素并将其打印出来。 main() int *p,i,a10; p=a; /*确定指针指向*/ for(i=0;i10;i+) scanf(“%d”,p+); /*指针绝对移动引用*/ printf(“n”); p=a; /*指针复位*/ for(i=0;i10;i+) printf(“%2d”,*(pi);/*指针相对移动引用*/,例7.2,研究式学

13、习C程序设计(第七章),23,数组名和指针变量,引用数组元素既可以由下标也可以由指针来实现; 数组名代表数组的首地址,由编译系统分配,是一个常量; 指针变量是一个变量,当它指向数组指针后,数组名和指针变量名可以混用; 指针变量可以作为赋值表达式的左值使用,可以自增自减,可以指向数组中任意元素; 数组名是常量,不能随意改变。,研究式学习C程序设计(第七章),24,数组与指针,四种访问数组的方法。 #include”stdio.h” main() int i; int test=20,30,90,80; int *p=test; printf(“arrar test printed n”); pr

14、intf(“ array subscript notation n”); for(i=0;i=3;i+) /*数组名加下标*/ printf(“test%d=%dn”,i,testi); printf(“n array ,例7.3,研究式学习C程序设计(第七章),25,数组与指针,for(i=0;i=3;i+) /*数组名加偏移量*/ printf(“*(test+%d)=%dn”,i,*(test+i); printf(“n pointer subscript notation n”); for(i=0;i=3;i+) /*指针加下标*/ printf(“pointer%d=%dn”,i,p

15、i); printf(“n pointer ,研究式学习C程序设计(第七章),26,指针指向数组时的运算,指针一旦指向数组后,指针的算术运算就有了以下具体的含义: 1指针与整数的加减法 指针加上(减去)一个整数,得到的结果仍是指针,表示指针由当前的位置向前(向后)移动n个数据位置。这一操作要求指针指向连续存放的若干同类型的数据,并且移动n个数据位置后指针仍然指向这片数据时才有意义。 自增/自减运算 指针进行自增/自减运算,结果仍然为指针,可以使指针向前(+)或向后(-)移动一个数据位置,要求同上。 在使用时要注意*和+(-)运算的优先级。,研究式学习C程序设计(第七章),27,指针指向数组时的运算,int a10,*p= 则:*p+: 相当于*(p+),即访问a3之后p再指向a4 (*p)+: 是将a3元素的值增一,p仍然指向a3 *-p: 相当于*(-p),即p指向a2之后再访问a2 -(*p):是a3元素的值将减一,p仍然指向a3,指针减法运算 指针相减反映出两个指针之间相隔的数据个数,要求这两个指针都指向同一个数组、字符串或链表,否则两个不相干的指针相减没有意义。,研究式学习C程序设计(第七章),28,指针指向数组时的运算,2.指针的关系运算 两个指向同种数据类型的指针可作关系运

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号