版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、重庆邮电大学计算机科学与技术学院 冯 潇 ,指针及其应用,2020/8/2,主要内容,指针的概念; 难点:对指针数据类型的理解 用指针做函数参数; 指针与一维数组 数组名作为函数参数 一维数组与一维数组元素指针的区别 插入和删除数组元素,2020/8/2,重点、难点,对于指针概念的理解 对于地址、直接寻址、间接寻址的理解 对于指针作为函数参数的理解 对于指针和数组关系的理解 利用指针解决字符串问题,2020/8/2,变量再探,什么是变量? 程序运行过程中其值会发生改变的量 变量有3个特点; 变量要占用一定的存储空间 变量有名字 程序运行过程中变量的值可能发生改变 变量的实质 在高级语言中,变量
2、是对存储单元和内存地址的映射 通过使用变量名定位存储单元的寻址方式叫直接寻址,2020/8/2,计算机内的存储部件,所有指令和数据都保存在内存里 速度快,但是掉电即失 可以随机访问 内存中的每个字节都有唯一的一个地址 地址按字节编号,按类型分配空间 只要指明要访问的内存单元的地址,就可以立即访问到该单元 地址是一个无符号整数,其字长一般与主机相同,内存(Random Access Memory)地址(Address),2020/8/2,寻址方式,直接(寻址)访问 通过变量地址直接存取变量内容 间接(寻址)访问 通过指针变量来间接存取它所指向的变量,2020/8/2,什么是指针,专门存放地址数据
3、的变量即为指针变量 指针也是一种数据类型,也有与之相应的运算法则 指针是不是地址? 地址是一个无符号整数,其字长一般与主机相同 指针是一个变量,完全符合变量的3个特点 定义指针 类型* 指针变量名; “*”为指针类型说明符,2020/8/2, p= ,2020,20,2020/8/2,int i,*p; p=,int *p; float *q; p=q;,int i; float *p; p=,int *p; p=100;,判断是真?是假?,指针变量只 存放地址!,一个指针变量不能指向与其类型不同的变量!,我是真的, 你猜对了吗?,应在类型相同的指针变量之间赋值,2020/8/2,指针运算,算
4、术运算 int *p, a10; p = a; p+; /*p的值增加多少?*/ 指针的加减运算是以其指向的类型的字节长度为单位的,6000 6001 6002 6003 6004 6005 6006,2020/8/2,指针运算,int *p, *q, a10;p = a;q = 指针运算不能乱算 一般只进行指针和整数的加减运算,同类型指针之间的减法运算 其它运算,比如乘法、除法、浮点运算、指针之间的加法等,并无意义,所以也不支持,2020/8/2,指针变量与其它类型变量的对比,共性 在内存中占据一定大小的存储单元 先定义,后使用 特殊性 它的内容只能是地址,而不能是数据,TC下2B,VC下4
5、B 必须初始化后才能使用,否则指向不确定的存储单元,对该空间进行访问,将可能造成危险 可参与的运算:加、减一个整数,自增、自减、关系、赋值 只能指向同一基类型的变量,2020/8/2,为什么要引入指针?,铁杆C/C+程序员最挚爱的武器:指针 C/C+的高效、高能主要来自于指针 很多不可能的任务由指针完成 指针的作用: 为函数提供修改变量值的手段 为C的动态内存分配系统提供支持 为动态数据结构(如例链表、队列、二叉树等)提供支持 可以改善某些子程序的效率,2020/8/2,交换两个数的值,void swap(int x,int y) int temp; temp = x; x = y; y =
6、temp; ,void main() int a, b; a = 5; b = 10; swap(a, b); printf(a=%d,b=%d,a,b); ,2020/8/2,回顾,5,10,void swap(int x,int y) int temp; temp = x; x = y; y = temp; ,void main() int a, b; a = 5; b = 10; swap(a, b); printf(a=%d,b=%d,a,b); ,2020/8/2,用指针作为函数参数,2020/8/2,改进:,void swap(int *x,int *y) int temp; te
7、mp = *x; *x = *y; *y = temp; ,void main() int a, b; a = 15; b = 8; swap( ,2020/8/2,swap函数的几种错误形式(1/3),参数单向传递 void Swap(int x, int y) int temp; temp = x; /*x,y为内部变量*/ x = y; y = temp; ,2020/8/2,swap函数的几种错误形式(1/2),参数单向传递 void Swap(int *p1, int *p2) int *p; p = p1; /*p1,p2为内部变量*/ p1 = p2; p2 = p; ,2020
8、/8/2,swap函数的几种错误形式(2/2),指针p没有确切地址 void Swap(int *p1, int *p2) int *p; /*指针p未初始化*/ *p = *p1; *p1 = *p2; *p2 = *p; ,2020/8/2,几点说明,当指针作为函数的形参时,被调函数可以通过指针间接修改定义于主调函数中的数据。在实际编程中,我们经常利用到这一特性 当指针作为函数的形式参数时,实参可以是地址、指针,也可以是数组名 同样地,数组名也可以作为指针来充当函数的形式参数,2020/8/2,void sort(double a,int n) int i,j; double temp;
9、for(i=0;iaj+1) temp=aj; aj=aj+1; aj+1=temp; ,2020/8/2,在一个班级中找出最高分及其学号,void FindMax(float score, long num, int n, float *pMaxScore, long *pMaxNum) int i; *pMaxScore = score0; *pMaxNum = num0; for (i=1; i *pMaxScore) *pMaxScore = scorei; *pMaxNum = numi; ,指针参数指定了存放这两个值的地址,2020/8/2,指针与数组,数组名就是一个指针 只是不能
10、修改这个指针的指向 可以定义函数的参数为数组 指针也可当作数组名使用 int *p, a10;p = a; 数组元素的几种等价引用形式 ai *(a+i) pi *(p+i),6000 6001 6002 6003 6004 6005 6006 6007,a,a+1,a+2,6000 6001 6002 6003 6004 6005 6006 6007,a,p+,p+,2020/8/2,输入输出数组的全部元素,main() int a10; int i; for (i=0; i10; i+) scanf(%d, ,方法1:下标法,main() int a10; int *p; for (p=a
11、; p(a+10); p+) scanf(%d, p); for (p=a; p(a+10); p+) printf(%d , *p); ,方法2:指针法,2020/8/2,字符串与字符数组、字符指针,C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理 字符串 一串以0结尾的字符 字符数组 每个元素都是字符类型的数组 char string100; 字符指针 指向字符类型的指针 char *p; 数组和指针可以等同看待,上面三者本质上是一回事,2020/8/2,字符指针变量与字符数组的区别,定义方法不同 char str10; char *ptr; 赋值方法不同 cha
12、r str10; ptr = ”china”; /*错误*/ strcpy(str,”china”); /*正确*/ char *ptr; ptr = ”china”; 字符指针是变量,而数组名是地址常量,2020/8/2,使用字符指针的注意事项,字符指针变量必须有明确的指向,否则使用是危险的 例如,输入字符串时 char *a; scanf(%s, a); /*错误*/ 应为: char *a; char str10; a = str; scanf(%s, a); /*正确*/,2020/8/2,例7.5 :字符串拷贝用字符数组编程,void MyStrcpy(char dstStr, ch
13、ar srcStr) int i = 0; while (srcStri != 0) dstStri = srcStri; i+; dstStri = 0; ,2020/8/2,void MyStrcpy(char *dstStr, const char *srcStr) while (*srcStr != 0) *dstStr = *srcStr; srcStr+; dstStr+; *dstStr = 0; ,当只允许函数访问地址内容,不允许修改时,可以把函数的指针参数定义为const,例7.5 :字符串拷贝用字符指针编程,2020/8/2,习题6.13 :编程实现strcat(),# include
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026新疆图木舒克团结医院招聘16人笔试备考试题及答案解析
- 2026年广西质量工程职业技术学院单招职业适应性测试模拟测试卷附答案
- 2026年河南省洛阳市单招职业适应性考试模拟测试卷及答案1套
- 2026云南西双版纳州勐海县人力资源和社会保障局招聘城镇公益性岗位人员3人笔试参考题库及答案解析
- 2026中国农业科学院农业环境与可持续发展研究所招聘创新工程科研团队首席科学家1人笔试备考试题及答案解析
- 2026年浙江经济职业技术学院单招职业技能测试模拟测试卷附答案
- 2026年心理趣味测考试题库带答案
- 2026年岳阳职业技术学院单招职业技能考试模拟测试卷附答案
- 2026广东中山市阜沙镇第一幼儿园招聘体育非编教师1人笔试备考题库及答案解析
- 2026宁夏广银铝业有限公司招聘10人笔试备考试题及答案解析
- 小区道闸广告合同(标准版)
- 2025年山西铁道单招试题及答案
- 现场缺陷件管理办法
- DB42T 831-2012 钻孔灌注桩施工技术规程
- DBJ04-T489-2025 《智慧园林建设标准》
- 学校餐费退费管理制度
- 初三语文竞赛试题及答案
- 2025-2030中国石膏墙板行业市场发展趋势与前景展望战略研究报告
- 2024年度企业所得税汇算清缴最 新税收政策解析及操作规范专题培训(洛阳税务局)
- 实验室检测质量控制与管理流程
- 中小学教学设施设备更新项目可行性研究报告(范文)
评论
0/150
提交评论