已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章指针(P169),9.1地址和指针的概念(P171),“直接访问”方式:按变量地址存取变量值的方式称为“直接访问”方式。,计算机内存中的每一个字节有一个编号-“地址”,“间接访问”的方式:将变量i的地址存放在另一个变量中。,直接访问和间接访问的示意图:,“间接访问”的方法是:把3送到变量i_pointer所“指向”的单元。,在C语言中,将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元。,一个变量的地址称为该变量的指针。,请区分变量的指针和指针变量。,变量的指针就是变量的地址。存放变量地址的变量是指针变量,用来指向另一个变量。,为了表示指针变量和它所指向的变量之间的联系与区别,在程序中用“*”符号表示“指向”。,9.2变量的指针和指向变量的指针变量,一、指针变量的定义(P172),对指针变量的类型说明包括三个内容:,因为指针变量用来专门存放地址,所以必须将它定义为“指针类型”。,(1)指针类型说明,即定义变量为一个指针变量;,(2)指针变量名;,(3)变量值(指针)所指向的变量的数据类型。,其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。,定义指针变量的一般形式为:基类型*指针变量名,例如:int*p1;,表示p1是一个指针变量,它的值是某个整型变量的地址。,1、指针变量前面的“*”,表示该变量的类型为指针型变量。,注意:,例如:int*p1;指针变量名是p1,而不是*p1。,2、在定义指针变量时必须指定基类型。,必须规定指针变量所指向的变量的类型,即基类型。,一个指针变量只能指向同一个类型的变量不能忽而指向一个整型变量忽而又指向一个单精型变量。,二、指针变量的赋值(P175-P176),语言中提供了地址运算符int*p=,(1)赋值语句的方法inta;int*p;p=,注意:,2、不允许把一个数赋予指针变量。,故下面的赋值是错误的:int*p;p=1000;,3、被赋值的指针变量前不能再加“*”说明符。,如写为*p=a=12;p=,其中:p为指针型变量。,此处a与*p的含义相同,即*p是p所指向的变量。,main()int*p1,*p2,a,b;scanf(%d,%d,注意:指针运算符*和指针变量说明中的指针说明符不是一回事。,main()int*p1,*p2,*p,a,b;scanf(%d,%d,这个问题的算法是不交换整型变量的值,而是交换两个指针变量的值(即a,b的地址)。,请问:a和b的值交换了吗?,例:任意输入两个整数x、y,请交换x、y中的值,并输出,要求用指针变量。(与前面的例子做个比较),main()intx,y,*px,*py,t;scanf(%d,%d,例:通过指针操作,找出3个整数中的最小值并输出。,main()int*x,*y,*z,a,b,c,min;x=,2、指针变量的运算(P175P177),指针变量初始化赋值inta;int*p=,把一个变量的地址赋予指向相同数据类型的指针变量。,inta,*pa;pa=,把一个指针变量的值赋予指向相同类型变量的另一个指针变量。,inta,*pa=,把数组的首地址赋予指向数组的指针变量。P182,inta5,*pa;pa=a;,也可写为:pa=,把字符串的首地址赋予指向字符类型的指针变量。P189,例如:char*pc;pc=clanguage;,存放该字符串的字符数组的首地址装入指针变量。,加减算术运算,对于指向数组的指针变量,可以加上或减去一个整数n。,设pa是指向数组a的指针变量,则pa+n,pa-n,pa+,+pa,pa-,-pa运算都是合法的。,指针变量加或减一个整数n的意义是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。,例如:inta5,*pa;pa=a;pa=pa+2;,pa指向a2,即pa的值为inttemp;temp=x;x=y;y=temp;,main()inta,b;scanf(%d,%d,提问:a、b两个变量中的值有变化吗?,swap(p1,p2)int*p1,*p2;inttemp;temp=*p1;*p1=*p2;*p2=temp;,main()inta,b;int*pointer_1,*pointer_2;scanf(%d,%d,提问:a、b两个变量中的值有变化吗?,对比一下如果是传值调用会怎样?,swap(p1,p2)int*p1,*p2;int*temp;temp=p1;p1=p2;p2=temp;,main()inta,b;int*pointer_1,*pointer_2;scanf(%d,%d,提问:a、b两个变量中的值有变化吗?,不能通过改变指针形参的值而使指针实参的值改变。,(4)主调函数中就可以使用这些改变了值的变量。,上题要改变n个数值的值解题步骤为:,(1)在主调函数中设n个变量,用n个指针变量指向它们。,(2)然后将指针变量作实参;将n个变量的地址传给所调用的函数的形参。,(3)通过形参指针变量改变该n个变量的值。,9.3数组的指针和指向数组的指针变量(P182),指向数组的指针变量称为数组指针变量。,所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。,一、指向数组的指针变量的定义与赋值,指向数组的指针变量与指向变量的指针变量的定义方法是相同的。,如:inta10;int*p;,以下两条语句是等价的p=inti;for(i=0;i10;i+)scanf(“%d”,main()inta10;inti;for(i=0;i10;i+)scanf(“%d”,通过数组名计算元素地址,找出元素的值。,main()inta10;inti;for(i=0;i10;i+)scanf(“%d”,用指针变量指向数组元素,在使用变量时,有几个问题要注意:,(1)指针变量可以实现指针本身的值改变。,for(i=0;a(p+10);a+)scanf(“%d”,*a);,如果不用p而使a变化(例如:用a+),即最后一行改为:,因为a是数组名,它是数组首地址,它的值在程序运行过程中是固定不变的,是常量。,(2)要注意指针变量的当前值,main()inta10;inti,*p;p=a;for(i=0;i10;i+)scanf(%d,p+);printf(n);for(i=0;ip。,III)*(p+)与*(+p)作用不同。前者先取*p值,后使p值加1。后者是先使p值加1,再取*p。若:p初值为a(即while(pa+100)printf(“%d”,*p+);,p=a;while(pa+100)printf(“%d”,*p);p+;,例:用指针完成:将数组a中的数据按逆序存放。,main()inta10,*p,i,t;for(i=0;i10;i+)scanf(%d,a+i);p=a;for(i=0;i10/2;i+)t=*(p+i);*(p+i)=*(p+9-i);*(p+9-i)=t;for(i=0;i10;i+)printf(%d,*(a+i);,三、数组名作为函数参数P185,此编程方法是将数组名作为实参传递给函数,函数的形参也是数组名,这样将实参数组地址传给形参。这样实参数组与形参数组共占用一段内存。,intmin,max;main()inti,a10;for(i=0;i10;i+)scanf(“%d”,max_min(array,j)intarray,j;inti;max=min=array0;for(i=1;imax)max=arrayi;,实际上,能够接受并存放地址值的只能是指针变量。因此,C编译系统都是将形参数组名作为指针变量来处理的。,所以编程序时写为max_min(intarray,intj),但在编译处理时是将array按指针变量处理的,相当于将函数的首部写成:Max_min(int*array,intj),indmax(int*a,intn)int*p,*s;for(p=a,s=a;p-a*s)s=p;return(*s);main()intx5=12,21,16,6,18;printf(maxid%dn,findmax(x,5);getch();,编写一个子函数用来返回数组中的最大数。,9.4字符串与指针P189,字符串的表示形式,在C程序中,可以用两种方法访问一个字符串。,1、用字符串数组存放一个字符串,然后输出该字符串,main()charstr=abcdefg;printf(%s,str);getch();,2、用字符指针指向一个字符串,可以不定义字符数组,而指定一个字符指针。用字符指针指向字符串中的字符。,main()char*pa=ab
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 胆汁浓缩综合征的护理
- 雨课堂学堂在线学堂云《菜鸟的职场英语进阶指南》单元测试考核答案
- 浙江国企招聘-2025浙江仙之泉水业有限公司招聘4人历年真题汇编附答案解析
- 2026年土地登记代理人之土地权利理论与方法题库200道及参考答案【夺分金卷】
- 2025年河北秦皇岛市公安医院公开招聘一般卫生专业技术人员8名备考公基题库带答案解析
- 2025四川攀枝花市仁和区金江镇卫生院招聘药房工作人员1人历年真题库带答案解析
- 2026秋季中国电建集团核电工程有限公司招聘280人备考题库附答案
- 2026年教育部直属事业单位招聘11人(社会人员)历年真题汇编及答案解析(夺冠)
- 2026建信期货有限责任公司秋季校园招聘9人(福建有岗)历年真题汇编带答案解析
- 2025福建厦门市集美区园博幼儿园非在编(顶岗)教职工招聘2人历年真题库附答案解析
- 车辆验收标准课件
- 《农村公路技术状况评定标准(JTG5211-2024)》
- 物流基础知识培训内容课件
- 2025年河南省警务辅助人员招聘考试(公安基础知识)历年参考题库含答案详解(5卷)
- 预防术中获得性压力性损伤专家共识
- 《现代质量工程》课件-第五章 质量控制常用技术
- 3.2.《一元一次方程及其解法》去分母(教学课件)-沪教版(五四制)六年级数学上册
- 电力行业收费标准及政策解读
- 仓库安全管理与案例分析
- 长方体的体积说课课件
- 用餐礼仪知识课件
评论
0/150
提交评论