![[工学]第5章 指针.ppt_第1页](http://file.renrendoc.com/FileRoot1/2018-12/23/a9d26148-4d0e-481c-8494-1bd2c0a9669a/a9d26148-4d0e-481c-8494-1bd2c0a9669a1.gif)
![[工学]第5章 指针.ppt_第2页](http://file.renrendoc.com/FileRoot1/2018-12/23/a9d26148-4d0e-481c-8494-1bd2c0a9669a/a9d26148-4d0e-481c-8494-1bd2c0a9669a2.gif)
![[工学]第5章 指针.ppt_第3页](http://file.renrendoc.com/FileRoot1/2018-12/23/a9d26148-4d0e-481c-8494-1bd2c0a9669a/a9d26148-4d0e-481c-8494-1bd2c0a9669a3.gif)
![[工学]第5章 指针.ppt_第4页](http://file.renrendoc.com/FileRoot1/2018-12/23/a9d26148-4d0e-481c-8494-1bd2c0a9669a/a9d26148-4d0e-481c-8494-1bd2c0a9669a4.gif)
![[工学]第5章 指针.ppt_第5页](http://file.renrendoc.com/FileRoot1/2018-12/23/a9d26148-4d0e-481c-8494-1bd2c0a9669a/a9d26148-4d0e-481c-8494-1bd2c0a9669a5.gif)
已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 指 针,C程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存,能直接处理内存地址 得到多于一个的函数返回值,提 纲,指针的概念 变量的指针 数组的指针与字符串的指针 函数的指针与返回指针值的函数 指针的指针,5.1 指针的概念和定义,程序中: int i; float x;,内存中每个字节有一个编号地址,i 的值,x 的值,编译或函数调用时为其分配内存单元,变量是对程序中数据 存储空间的抽象,变量与地址,指针与指针变量 指针:一个变量的地址。 指针变量:专门存放地址的变量。,2000,指针,变量的内容,变量的地址,&与*运算符,含义: 取变量的地址 单目运算符 优先级: 2 结合性:自右向左,含义:取指针所指向变量的内容 单目运算符 优先级: 2 结合性:自右向左,i_pointer指针变量,它的内容是地址 *i_pointer指针的目标变量,它的内容是数据 &i_pointer指针变量所占内存的地址,i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i),直接访问与间接访问 直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的指针变量去访问变量,例 i = 3; -直接访问,3,例 *i_pointer = 20; -间接访问,20,5.2 指针变量,指针变量的定义 一般形式: 存储类型 数据类型 *指针变量名;,合法标识符,指针变量本身的存储类型,指针的目标变量的数据类型,表示定义指针变量 不是*运算符,例 int *p1,*p2; float *q ; char *name;,注意: 1、int *p1, *p2; 与 int *p1, p2 的区别; 2、指针变量名是p1,p2,不是*p1,*p2; 3、指针变量只能指向定义时所规定类型的变量; 4、指针变量定义后,变量值不确定,使用前必须先赋值。,指针变量的初始化 一般形式:存储类型 数据类型 *指针名=初始地址值;,赋给指针变量, 不是赋给目标变量,例 int i; int *p=,变量必须已说明过 类型应一致,例 int i=10; int *p=,用已初始化指针变量作初值,例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); ,危险!,例 main( ) int i=10, k; int *p; p= ,指针变量必须先赋值,再使用,指针变量不能与普通变量相互赋值。 下面的赋值语句都是非法的。 int num,*pn; char color,*pc;; pn=num; 或 num=pn; pc=color; 或 color=pc;,指向同一种数据类型的指针变量之间可以相互赋值,即一个已赋值的指针变量可以赋给另一个指针变量。 例如: int a,*pa,*pb; pa=,零指针与空类型指针 零指针:(空指针) 定义:指针变量值为零 表示: int * p=0;,p指向地址为0的单元, 空指针不表示任何指向,仅仅是指针的一种状态。,#define NULL 0 int *p=NULL:,p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较,例 int *p; while(p!=NULL) . ,空类型指针: void *指针变量名 表示:void *p; 使用时要进行强制类型转换,例 char *p1; void *p2; p1=(char *)p2;,表示不指定p是指向哪一种 类型数据的指针变量,例:指针的概念,main() int a; int *pa= ,指针变量的赋值运算 p= (指针变量p2值p1) 不能把一个整数p,也不能把p的值整型变量,如 int i, *p; p=1000; () i=p; (),5.2指针的运算,指针的算术运算: pi p id (i为整型数,d为p指向的变量所占字节数) p+, p- -, p+i, p-i, p+=i, p-=i等也类似 若p1与p2指向同一数组,p1-p2=两指针间元素个数 p1+p2 无意义,例 p指向float数,则 p+1 p+1 4,例 p指向int型数组,且p= 则p+1 指向a1,例 int a10; int *p=,例 int a10; int *p1=,1,指针变量的关系运算 若p1和p2指向同一数组,则 p1p2 表示p1指的元素在后 p1=p2 表示p1与p2指向同一元素 若p1与p2不指向同一数组,比较无意义 p=NULL 或 p!=NULL,注意: *p+ 等价于 *(p+),先得到*p的值,再做p+ *p- 等价于 *(p-) , 先得到*p的值,再做p-; *(+p) p先自增1,再得到*p的值 *(-p) p先自减1,再得到*p的值; (*p)+ 使元素值加1,(*p)- 使元素值减1。,5.3 指针与数组,5.3.1 指针与一维数组 指向数组元素的指针变量,例 int array10; int *p; p=,数组名是表示数组首地址的地址常量,注意:当指针变量一旦指向一维数组的起始地址,指针变量名可以当成一维数组名使用,因此datai与pi是等效的,即有: p0=100; p1=200; pi=500; 如图5.3.1所示,以下赋值语句等效: *p=100; 等效于 data0=100; *(p+1)=200; 等效于 data1=200; *(p+i)=500; 等效于 datai=500; 若指针p当前指向数组的起始地址,执行语句:p=p+4 则将指针从指向数组的第一个元素改变为指向数组的第五个元素data4,例:int a=1,2,3,4,5,6,7,8,9,10, *p=a, i; 数组元素地址的正确表示: (A)&(a+1) (B)a+ (C)&p (D)&pi,数组名是地址常量 p+,p- () a+,a- (),例:*p+=*q+; /*含义为:*p=*q; p+; q+; */,总结:指针变量与一维数组的关系 int *p 与 int q10 数组名是指针(地址)常量 p=q; p+i 是qi的地址 数组元素的表示方法:下标法和指针法,即若p=q, 则 pi qi *(p+i) *(q+i),指针与二维数组,int a54;*pa; paa0; 表示将一维数组a0的起始地址赋给指针pa,即pa指向一维数组a0的第一个元素a00。 与该赋值语句等效的语句有: pa=a; 或 pa= 表示pa自增1,即将指针pa指向元素a01。,同理,若执行pa=a4; 表示将一维数组a4的地址赋给指针pa,也即将指针指向数组元素a40。*pa 即为数组元素a40的值。,5.4 字符串指针,字符串表示形式 用字符数组实现,例 main( ) char string=“I love China!”; printf(“%sn”,string); printf(“%sn”, string+7); ,用字符指针实现,例 main( ) char *string=“I love China!”; printf(“%sn”,string); string+=7; while(*string) putchar(string0); string+; ,字符指针初始化:把字符串首地址赋给string char *string; string=“I love China!”;,*string!=0,字符指针变量与字符数组 char *cp; 与 char str20; str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址 char str20; str=“I love China!”; () char *cp; cp=“I love China!”; () str是地址常量;cp是地址变量 cp接受键入字符串时,必须先开辟存储空间,例 char str10; scanf(“%s”,str); () 而 char *cp; scanf(“%s”, cp); (),改为: char *cp,str10; cp=str; scanf(“%s”,cp); (),字符串与数组关系 字符串用一维字符数组存放 字符数组具有一维数组的所有特点 数组名是指向数组首地址的地址常量 数组元素的引用方法可用指针法和下标法 数组名作函数参数是地址传递等 区别 存储格式:字符串结束标志 赋值方式与初始化 输入输出方式:%s %c,char str=“Hello!”; () char str=“Hello!”; () char str=H,e,l,l,o,!; () char *cp=“Hello”; () int a=1,2,3,4,5; () int *p=1,2,3,4,5; (),char str10,*cp; int a10,*p; str=“Hello”; () cp=“Hello!”; () a=1,2,3,4,5; () p=1,2,3,4,5; (),5.5 指针数组,指针数组 定义:数组中的元素为指针变量 定义形式:存储类型 数据类型 *数组名数组长度;,指针所指向变量的数据类型,指针本身的存储类型,注意:区分int *p4与int (*p)4,例:int *p4;,指针数组赋值与初始化,一级指针:指针变量中存放目标变量的地址,例 int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《三十讲》课件人民网
- 底商转让合同(标准版)
- 乐于助人的课件
- 龙华区复工复产申请报告(3篇)
- Dinoprostone-CoA-Dinoprostone-coenzyme-A-生命科学试剂-MCE
- zn91资料课件教学课件
- 临渭区人民消防安全培训课件
- 2025年婚姻家庭咨询师职业技能鉴定历年真题及答案解析
- 小学生爱牙日口腔健康知识竞赛备赛试题库150题(含答案)
- 人教版部编版小学语文一年级上册小小的船教学设计教案13
- 食品执行标准对照新版表
- 大班科学《神奇的洞洞》课件
- 第二次全国陆生野生动物资源调查技术规程
- 控制计划CP模板
- 最新苏教牛津译林版英语五年级上册Unit 4《Hobbies》Grammar time 公开课课件
- 《民用航空法》考试复习题库100题(含答案)
- 路面压浆施工方案
- 第8课时 主题阅读《雨的四季》-2022-2023学年七年级语文上册(部编版)
- Linux基础入门培训
- 现场技术服务报告模版
- 完整课件-西方经济学下册(第二版)
评论
0/150
提交评论