版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章指针,交实验报告168页1题格式:按照上机指导书171页附录D格式书写采用统一的实验报告纸,预备知识,内存:就是内部存储器,是由存储单元组成的。它的特点是存储单元是线性连续的。存储单元的最小单位是字节。,1.内存的概念,地址:为了访问内存中的某个存储单元,我们要为它编号,这种编号称为内存地址。通过地址我们就能够访问该地址所标识的存储单元。,2.地址的概念,变量的地址:变量在内存中总占用几个连续的字节,开始字节的地址,就是变量的地址。,2007,存储单元,main()intiA,iB,iC;floatfX,fY,fZ;iA=iB=3;fX=fY=4.0;iC=iA+iB;fZ=fX+fY;
2、,8.1什么是指针,指针就是变量的地址E.g.fX的地址为1000,那么1000就是fX的指针。也可以说,1000指向fX。E.g.iA的地址为1500,那么1500就是iA的地址。也可以说,1500指向iA.,指针不仅仅是变量的地址,还包含了其指向变量的类型信息.E.g.1000是fX的指针,其指向1000开始的浮点数。E.g.1500是iA的指针,其指向1500开始的整数.,直接访问与间接访问直接访问:按变量地址存取变量值间接访问:通过存放变量地址的变量去访问变量,例i=3;-直接访问,3,例inti=3,*p;p=-间接访问,8.2指针变量,定义指针变量的说明,变量名p前面的“*”不能省
3、略,如写成int*p1,p2;则p2被定义为整型变量,而非整型指针变量。,用来指定该指针变量可以指向的变量的类型。在定义指针变量时必须指定基类型。(因为不同类型的变量在内存中所占字节数不同,这就涉及到指针移动时,移动一步越过几个字节的问题),把一个整型变量的地址赋给一个指针变量,即实现指向。,定义中的“*”表示所定义的变量是指针变量,但指针变量名是p1、p2,而非*p1、*p2。,指针变量只能指向定义时所规定类型的变量。这个规定的类型称为该指针变量的“基类型”。,如上例中p只能指向整型变量,不能指向实型或字符型变量。其“基类型”相同,是整型。,定义指针变量后,并未确定该变量指向何处。也就是说该
4、变量的值是不确定的。在引用指针变量前必须首先让它指向一个变量。如inti,*p;p=,由此可见:通过指针运算符“*”可以引用一个变量。如:当p已经指向变量i后,*p就等同于i。*ptr=15;等价于i=15;,二、指针变量的引用,printf(“%d,%dn”,i,*p);scanf(“%d,%dn”,例1:main()inta,b,*p1,*p2;a=100;b=10;p1=运行结果:100,10100,10,例2:输入a和b两个整数,按先大后小的顺序输出。main()inta,b,*p1,*p2,*p;scanf(“%d”,三、指针变量作为函数参数,例1:编写实现两个数的交换的函数,作用:
5、将一个变量的地址传送到另一个函数中。,swap(int*p1,int*p2)inttemp;temp=*p1;*p1=*p2;*p2=temp;main()inta,b,*p1,*p2;p1=,例4:编写函数,根据传送过来的运算符,对传送过来的两个浮点数进行+、-、*、/运算,把结果传回调用函数(不用return语句)。,Xx(charm,float*p1,float*p2,float*p3)if(m=+)*p3=*p1+*p2;elseif(m=-)*p3=*p1-*p2;elseif(m=*)*p3=(*p1)*(*p2);else*p3=(*p1)/(*p2);Main()floata,
6、b,s,*z,*x,*c;chary;z=,8.3通过指针引用数组,C规定:,数组名代表数组的首地址(起始地址).如:inta10,*p;则:p=a;与p=等价称指针变量p指向数组元素a0,指针变量p指向数组时,p+1指向数组的下一个元素。p+i、a+i、for(i=0;i10;i+)printf(%4d,*(a+i);,例2:用指针变量指向数组元素利用指针变量效率最高。main()inta10=54,65,8,2,3,56,8,21,57,98,*p,i;p=a;for(i=0;i10;i+)printf(%4d,*p+);,(1)指针变量与数组名的区别:指针变量是地址变量,数组名是地址常量
7、。即指针变量的内容可以在程序运行过程中被改变;数组名一旦被定义,它的值就不能被改变了。,但前面用a+i表示第二个元素的地址,因为a的值没变。而a+表示a=a+1,不能给常量赋值,利用指针变量编程时特别要注意指针变量的当前值。,应插入语句p=a;,三、数组名作函数的参数,例如:f(intarr,intn)main()intarray10;f(array,10);,能接受并存放地址值的只能是指针变量。C编译系统都是将形参数组名作为指针变量来处理的。例中f(intarr,intn)等价于f(int*arr,intn)。使用形参数组的概念只是为了与实参数组对应,直观,便于理解而已。,例:从10个数中找
8、出其中最大值和最小值。,main()voidmax_min(inta,intn,int*p1,int*p2);inti,b10=2,4,1,6,7,32,45,75,45,90,max,min;max_min(b,10,main()voidmax_min(int*x,intn,int*max,int*min);inti,b10=2,4,1,6,7,32,45,75,45,90,max,min;max_min(b,10,x+,上例中如果形参数组用指针变量,则程序如下:,实参与形参都用数组名;,实参用数组名,形参用指针变量;,例:实参、形参都用指针变量的形式,main()inta10,*p;p=a
9、;f(p,10);,f(int*x,intn),例:实参为指针变量,形参用数组名。,main()inta10,*p;p=a;f(p,10);,f(intx,intn),对于二维数组:(1)a是数组名,包含三个元素a0,a1,a2(2)每个元素ai又是一个一维数组,包含4个元素,inta34;,基类型,行指针与列指针,四、多维数组与指针,对二维数组inta34,有a-二维数组的首地址,即第0行的首地址a+i-第i行的首地址ai*(a+i)-第i行第0列的元素地址ai+j*(a+i)+j-第i行第j列的元素地址*(ai+j)*(*(a+i)+j)aij,a+i=for(i=0;i2;i+)p=ai
10、;for(j=0;j3;j+)scanf(“%d”,p+j);printf(“%d”,*(p+j);,分别把第0行第1行的起始地址放入P中,因为a0,a1是一行的起始地址,其中每行还包含有三个元素:a00a01a02,p=a0只是把第0行的起始地址给P,此时p+1表示第0行第1列的那个元素(a01)的地址,所以P+j分别表示第0行各元素的地址。要想使P指向第二行,必须重新赋给P第二行的首地址。p=a1,指向一维数组的指针变量定义形式:数据类型(*指针名)一维数组维数;例int(*p)4;,()不能少int(*p)4与int*p4不同,p的值是一维数组的首地址,p是行指针,可让p指向二维数组某一
11、行如inta34,(*p)4=a;,一维数组指针变量维数和二维数组列数必须相同,例题一维数组指针变量举例,main()staticinta34=1,3,5,7,9,11,13,15,17,19,21,23;inti,j,(*p)4;p=a;for(i=0;i3;i+)for(j=0;j4;j+)printf(%d,*(*p+j);p+;,p0j,8.4通过指针引用字符串,定义了一个指向字符串的指针变量,并将字符串的首地址赋值给strp指针变量,即:使指针变量strp指向字符串首地址。,C程序访问字符串有以下两种方法:,2用字符指针指向一个字符串,例如:char*ps=Iamastudent.;
12、字符串输出语句可写成:printf(“%sn”,ps);*以字符串形式输出时写字符串的地址*,说明:,字符数组由若干个元素组成,每个元素中放一个字符。而字符指针变量中存放的是字符串的首地址,不是将字符串放到字符指针变量中。例如:char*ps=Iamastudent.;,字符数组和字符指针变量都可以在定义时赋初值。chars10;s=“hello!”;chars10=“hello”;=chars10=h,e,l,l,o,0;char*ps;ps=“hello!”;=char*ps=“hello”;,字符指针变量必须先赋值后使用,否则对系统构成危险。char*ps;scanf(“%s”,ps);
13、char*ps,s10;ps=s;scanf(“%s”,ps);,字符数组名是指针常量,只能表示一个确定的字符串,不能改变。字符指针变量的值是可改变的。,若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指字符串中的字符。如:char*a=“IloveChina!”;printf(“%c”,a5);,用指针变量指向一个格式字符串,可以用它代替printf函数的格式字符串。如:inta;char*format;format=“a=%dn”;则:printf(format,a);相当于printf(“a=%dn”,a);,main()char*a=“iamastudent”;a=a+7;printf(“%s”,a);结果:student,main()charc=“iamastudent”;c=c+7;printf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年党校在职研究生专业基础理论知识考试全真模拟试卷及答案(三)
- 2026年党校在职研究生入学考试政治理论冲刺押题试卷及答案(十六)
- 教练的责任心演讲稿
- 命运与金钱的演讲稿英文
- 冬奥会团课演讲稿主题
- 辅警救人的演讲稿
- 践行节水行为规范演讲稿
- 哈佛大学开学演讲稿件
- 国旗班竞选教练演讲稿
- 传世经典为内容的演讲稿
- 《离子型稀土矿山开采污染物排放-标准编制说明》
- 金融银行数据治理体系详细方案(技术方案)
- 中职高考《农业经营与管理》考试题库大全-下(判断题)
- 营业厅业务受理(情景演练)课件
- 徐悲鸿介绍及作品课件
- 计算机导论第2版微课视频版吕云翔课后参考答案
- 2024年陕西榆能化学材料公司招聘笔试参考题库含答案解析
- 妇科诊疗常规
- 警惕病从口入-课件
- 脑疝、重症患者脑保护及颅内压监测
- 踝足部解剖和功能培训课件
评论
0/150
提交评论