




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
闽南理工学院备课笔记 第10次课第7章指针指针是C语言中的一个重要概念,也是C语言中最难掌握的知识。学会正确灵活地运用指针,可以有效地表示复杂的数据结构,能动态分配内存,能方便而有效地使用字符串和数组,更能直接处理内存地址等,这些都是设计系统软件时必要的知识。掌握指针,还可以使程序简洁,紧凑,高效。可以说,掌握了指针就掌握了C语言的精华。指针概念抽象,使用灵活,初学时不易理解,所以在学习指针时,要多思考,多联系比较,在理解了基本概念后,要多上机,多操作,在实践中巩固掌握指针。只要做到这些,指针知识也是不难掌握的。7.1 指针的概念 指针是C语言中广泛使用的一种数据类型,运用指针编程是C语言的重点和难点。 为了更好地理解指针,先举例说明数据在内存中是如何存取的。在内存中是以一个字节作为存储单元,为了能正确地访问存储单元,每个存储单元都有一个编号,这个编号就称为“内存单元的地址”。如果在c程序中定义了一个变量,系统就会根据变量的类型分配一定长度的内存空间。而数据存取时是根据数据对应变量的地址进行的。如图7.1所示,假设C程序中已定义了三个整型变量i,j,k,编译时系统分配1000和1001两个字节的空间给变量i, 1002和1003两个字节的空间给变量j, 1004和1005两个字节的空间给变量k,在读取变量i的值3时是先找到变量i的地址1000,连续读取两个字节取出数据3输出。存储变量i的值时,由键盘输入值存到地址为1000开始的整型存储单元中。再如k=i+j,先从1000,1001字节中取出i的值3,再从1002,1003字节中取出j的值5,相加后将和8存到k所占用的1004,1005单元中,这种系统按变量地址存取变量的值,称为“直接存取”方式。3581000 内存用户数据区 1000 变量i 1002 变量j 1004 变量k 2010 变量p 图7.1 内存单元的地址7.1.1 指针和指针变量指针就是上述所说的变量的地址,是一个整型常量,其值通过对变量取地址符&得到,指针指向一个内存单元。而如果把这个地址再用一个变量来保存,则这个变量就称为指针变量,如图7.1变量p中存放的数据是变量i的地址,变量p就称为指针变量,通过变量p可以间接地存取变量i的数据,先取出p的值“地址1000”,再到“地址1000”处存取数据,这种通过变量p间接得到变量i的地址,然后再存取变量i的值的方式称为“间接存取”方式。7.1.2 指针变量的定义 由上而知,有一种特殊的变量,专门用来存放其它变量的地址的,这样的变量称为指针变量。指针变量在定义时必须定义为“指针类型”。定义指针变量的一般形式为:类型名 *标识符; 其中“标识符”是指针变量的名字,标识符前加“*”号表示该变量是指针变量,用于存放地址,“类型名”表示该指针变量所指向变量的数据类型。例如: int i, *p1, *p2; /* 定义p1与p2两个指针变量,它们可以指向int类型的变量*/ float f, *p; /* 定义p为指针变量,它可以指向float类型的变量*/ 说明:l C语言规定所有变量在使用前必须先定义,为了表示指针变量是不同于其他变量的,所以定义指针变量时前加指向符号“*”。l 一个指针变量只能指向类型相同的变量。若 p1=&i; 则称指针变量p1指向整型变量i,因为把变量i的地址赋值给了p1。赋值语句p1=&f; 是非法的,一个指向整型变量的指针变量不允许指向实型变量,因为不同类型的变量在内存中所占的字节数不同。7.1.3 指针变量的操作指针变量在使用时必须赋予具体的值,未经赋值的指针变量不能使用,指针变量中只能存放地址(指针),不要将非地址类型的数据赋给一个指针变量。指针变量可以通过两个相关的运算符赋值:1、取地址运算:&地址运算符“&”是单目运算符,运算对象放在地址运算符“&”的右边,用于求出运算对象的地址。通过地址运算“&”可以把一个变量的地址赋给指针变量。若有语句 float f, *p; p=&f; 执行后把变量f的地址赋值给指针变量p,指针变量p就指向了变量f.2、指针运算符(或称间接访问运算符):*指针运算符*是单目运算符,目的是访问操作对象所指向的变量。如*p为指针变量p所指向的变量。【例7.1】通过此例理解指针变量和普通变量的关系.main()int a=10;int *p;p=&a;printf(“a=%dn”,a);printf(“*p=%dn”,*p);printf(“&a=%dn”,&a);printf(“p=%dn”,p);printf(“%d,%dn”,p=&a,*p=a);说明:l 运用指向运算符*定义指针变量p,通过取址运算符使p指向变量a。则*p的值就是变量a的值,p的值就等于&a的值,都等于变量a的地址。l 使用指针变量进行间接访问前,必须赋初值,如果不赋初值,值就是不确定的。l 指针变量赋值一定要赋予和其相同数据类型的指针。若想赋予不同类型的,要先进行强制类型转换。如int i ,*p1=&i;float *p2;把p1的值赋给p2进行强制类型转换,语句为:p2=(float *)p1;l 在C语言中,可以定义空类型的指针变量。如:viod *p;说明p为空类型的指针变量,它指向的内存单元大小没有指定,若想使用空类型的指针变量,先要进行强制类型转换。【例7.2】 用指针实现任意3个整数按由小到大的顺序输出,完成本章的第一个任务。main()int a,b,c;int *p1,*p2,*p3,*t;printf(“请输入三个整数a,b,c:”);scanf(“%d,%d,%d”,&a,&b,&c);p1=&a;p2=&b;p3=&c;if(*p1*p2)p1=p2,p2=&a;if(*p1*p3)t=p1,p1=p3,p3=t;if(*p2*p3)t=p2,p2=p3,p3=t;printf(“%d%d%dn”,*p1,*p2,*p3);7.2 指针运算7.2.1 指针的赋值运算使用指针变量前,必须对其进行初始化,也就是对指针变量赋初值,将地址赋给指针变量。例如语句:p=&a; /*将变量a的地址赋给指针变量p*/p=array; /*将数组array的首地址赋给指针变量p*/p=&arrayi; /*将数组array第i个元素的地址赋给指针变量p*/p1=p2; /*p1和p2时是同类型指针时,就可以将p2的值赋给p1*/把一个地址赋给指针变量,表示这个指针变量指向了该地址,并不是把地址的具体值给指针变量,例如a变量的地址是1000,若p=&a,则p=1000;此语句将整数赋给了指针变量p是错误的。7.2.2 指针的加减运算1、指针移动在C语言中,可以对指针变量加减一个整数,如:p+i,p-i,p+,+p,p-,-p等。指针变量加或减一个整数的含义是使指针在当前指向位置的基础上向前或向后移动i个位置,移动后的结果仍为指针。例如:2、指针变量的相减运算指向同一块连续存储单元(通常是数组)的两个指针变量可以进行相减运算,设p1和p2是指向同一数组的两个指针变量,则两指针变量相减所得结果是指两个指针所指数组元素之间相差的元素个数,实际上是两个指针指向的地址相减之差再除以该数组元素所占用的字节数。如:p1和p2是指向整型数组a的两个指针变量,设p1的指向的地址为1000,p2指向的地址为1008,所以p2-p1的结果为(1008-1000)/2=4,表示p2,p1所指向的位置相差4个元素。注意:只有指向同一数组的两个指针变量之间相减才有意义,两指针变量相加操作时没有意义的。【例7.3】 本例说明指针变量“位移”和“相减”的操作。main() int a6=1, 2, 3, 4, 5, 6, *p1=a, *p2; /*p1指向整型数组a的首地址*/double d6=1.1, 2.2, 3.3, 4.4, 5.5, 6.6, *q1=d, *q2; /*q1指向双精度实型数组d的首地址*/p1+; /*p1指向a数组的元素a1,p1向下移一个元素(2个字节) */p2=p1+3; /*p2指向a数组的元素a4,p2与p1相距个元素*/printf(“%dn”,p1-p2); /*输出-3到屏幕,因为p2与p1相距元素的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版让与担保制度风险管理体系合同
- 2025版环保设备监造与节能改造合同
- 2025版特色小镇商铺委托出租运营合作协议
- 2025年度综合性商场展览场地租赁及广告投放合同
- 2025年度学校桶装水项目合作协议范本
- 2025年度房屋买卖分期付款及违约责任协议
- 2025年智能穿戴设备研发与市场推广合作协议
- 2025年度石油产品运输及保险服务合同
- 2025版专业摄像头研发与生产采购合同范本
- 2025版三方公司租赁设备借款合同
- PDCA循环在医院应急管理中的应用
- 2026创新设计高考总复习生物(人教版)-限时强化练答案解析
- 2025年人资部长面试题及答案
- 2025年中学生法治素养竞赛题库及答案
- 《语文八下第三单元复习课》课件
- 2025年山西省公务员考试行测试卷历年真题及答案详解(名校卷)
- 2025年消除艾滋病、梅毒、乙肝母婴传播培训考试试题(含答案)
- 2025年部编版语文四年级上册全册单元、期中、期末测试题及答案(共10套)
- 患者期望与实际效果-洞察及研究
- 风力发电税务培训课件
- 2025年长沙市中考物理试卷真题(含答案)
评论
0/150
提交评论