第05章 指针.ppt_第1页
第05章 指针.ppt_第2页
第05章 指针.ppt_第3页
第05章 指针.ppt_第4页
第05章 指针.ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章指针,学习的意思,是一种在语言中广泛使用的数据类型。用指针编程是最重要的语言风格之一。在C语言编程中使用指针可以使程序简洁、紧凑、高效、有效地表达复杂的数据结构,动态分配内存,得到多个函数返回值,并像汇编语言一样处理内存地址,从而编译出简洁高效的程序。学习指针是学习语言最重要的部分。我们能否正确理解和使用指针是我们是否掌握语言的标志。学习目标,理解指针的概念,掌握指针变量的定义和引用方法;掌握指针、数组和字符串之间的关系;掌握动态内存分配和释放的方法;掌握带有指针参数和返回指针的函数的定义方法;掌握函数指针的用法;学习内容,指针和指针变量的概念定义和引用指针和地址操作指针和指向数组的指针

2、和指向多维数组的指针变量数组指针元素指针数组指针数组指针和字符串指针以及动态内存分配多级指针和数组作为函数参数指针作为函数返回值_ _ _ _ _指针函数指针指向函数_ _ _ _ _。_函数指针带参数的主函数本章概述了指针和指针变量的概念,1。内存地址内存单元号、教室、教室容量、内存单元大小(字节单元、字单元),注意:内存单元地址和内存单元中的数据是两个完全不同的概念。2,变量地址系统分配给变量的存储单元的起始地址,在程序中为:浮动k;内存中的每个字节都有一个数字地址,当编译或调用一个函数时,它被分配一个内存单元。变量是程序中数据存储空间的抽象。注意:在TC或BC下,系统将分配一个2字节的单

3、位给变量I,而在VC下它将是一个4字节的单位!3。指针和指针变量指针:变量的地址指针变量:专用于存储变量地址的变量,2000,指针变量,指针,4,直接访问,3,示例* i _ pointer=20-间接访问、20、指针变量的定义和引用,1。变量值、10的访问方法,例如k=I;k=*i指针;-直接访问,-间接访问,2。指针变量和它所指向的变量之间的关系、I,*i_pointer,* I _ pointer=3;3.指针变量的定义,一般形式:存储类型数据类型符号*变量名;合法标识符,指示定义的指针变量不是*运算符、指针的目标变量的数据类型以及指针变量本身的存储类型。注:int *p1,* p2和i

4、nt *p1,p2;指针变量名是p1,p2,而不是*p1,*p2。指针变量只能指向定义中指定类型的变量。指针变量定义后,变量值是不确定的,所以在应用前必须赋值。例如,int *p1,* p2float *q。静态字符*名称;例如int I;Int *p=,void main()int I;静态int *p=.(),静态指针不能用标准C语言下的自动变量地址初始化(但可以在C程序中初始化),4。指针变量赋值、初始化赋值、存储类型数据类型*指针名称=初始地址值;赋给指针变量,而不是目标变量,变量必须已经被解释并且类型应该一致,如int I;Int *p=,使用初始化的指针变量作为初始值,例如,int

5、 a;int *p。P=,赋值语句赋值,例如,int a=20,int *p,* q;p=,q=p;20,2000,2000,示例int *p=,指针变量赋值的几种错误方法:变量a的定义较晚,对a的引用超出了a的范围,示例int a;Int *pi=,pc不能指向非字符变量,如int a;int *p。*p=,在赋值语句中,被赋值的指针变量p前面不能有“*”描述符,例如int * p;p=2000不允许直接给指针变量赋值,如int a;静态int *p=,静态指针不能用自动变量的地址初始化。注意:指针变量只能指向相同类型的变量。当给指针赋值时,如果等号右边的指针类型不同于左边的指针类型,则需要

6、类型转换。int a;int * pichar * pc=/pc也指向A,即和PC的值都是a5的地址。零指针和空指针零指针:(空指针)定义:指针变量值为零:int * p=0;p指向地址为0的单元,系统保证该单元不会用它来表示指针变量值没有意义。# define null0 int *p=null:p=null与不为p :赋值有不同的目的,以避免非法引用指针变量经常被用作程序中的状态比较,如int * p;而(p!=空).void *型指针表示: void * p;使用时需要强制类型转换,这意味着P没有被指定为指向哪种数据类型的指针变量,如char * p1void * p2P1=(char

7、*)p2;p2=(void *)P1;6,引用指针变量,int a;Int *p=,格式:*指针变量,int a,* p;P=,输出结果:a=11,*p=11,可以写成(*p)而不是*p。注意:当程序使用指针间接引用存储单元时,引用的存储单元将根据定义指针变量时所指向的数据类型进行解释。示例1不同类型的指针操作同一个内存变量,#包括void main()无符号短a;无符号短*pi=,2000,2000,pc可操作单元,F0,F0,00,输出结果:a=F000,例2输入两个数字,从大到小输出,#包括无效主()int * P1,* P2,* P,A,B;Scanf (%d,%d,运行结果:a=5,

8、b=9max=9,min=5,5,2006,9,2008,2006,2008,2008指针变量没有赋值是没有意义的,绝对不允许使用。指针变量只能指向定义时指定类型的变量。指针变量也是变量,它占用内存中的某些内存单元,但是所有类型的指针变量占用相同大小的内存单元,它们的具体大小取决于所使用的编译环境,例如BC3.1和VC6.0中的4个字节和TC2.0中的2个字节,1、指针变量加减运算、指针和地址运算,指针可以参与加减运算,但是加减运算的含义绝对不同于一般数值的加减运算。如果指针p定义如下:p类型* p;p的当前值是ADDR,那么p n=ADDR n * sizeof(ptype),int * p

9、ichar * pclong *pl。pi=(int *)1000;PC=(char *)1000;pl=(长*)1000;pi;/pi的值将是1002(假设int类型占用2个字节)pi-=2;/pi的值将是998 pc/PC的值将是1001 PC-=2;/pc的值将为999 pl。/pl的值将为1004 pl-=2;/圆周率的值将是996。注意:增加两个指针是没有意义的,但是减去两个指针是有意义的,这可以指示彼此不同的存储单元或元件的数量,这将在后面的研究中实现。2。指针变量的关系运算。如果p1和p2指向同一个数组,p1p2表示p1指向的元素后面跟着p1=p2,表示p1和p2指向同一个元素。

10、如果p1和p2不指向同一个数组,比较p=空或P是没有意义的!=空,1。数组指针,指针和数组。数组指针实际上是内存中数组的起始地址。内存中数组的起始地址是数组变量名,它是内存中数组的第一个元素的地址。例如:short int a10,int a10int k。对于(k=0;k10;k)AK=k;/使用数组下标,int a10int k。对于(k=0;k10;k)*(a k)=k;/使用数组的指针、指向数组的指针变量、指针和数组,如果数组的起始地址分配给指针变量,那么指针变量就是指向数组的指针变量。例如:short int a10,* p=a;注意:p 1指向数组的下一个元素,而不是简单地使指针变

11、量p 1的值。实际变化是P1 *大小(大小是一个元素占用的字节数)。例如,如果指针变量p的当前值是2000,那么p 1是2000 1*2=2002,而不是2001。,char str10int k。对于(k=0;k10;k)strk=A k;/也可以写成*(字符串k)=A k,字符str10int k。char * p;p=str对于(k=0;k10;k)PK=A k;/也可以写成*(p k)=A k,char str10int k。char * p;p=str对于(k=0;k10;k)* p=A k;/相当于* p=A k;p;以下是给数组元素赋值的几种方法,它们在功能上是等效的。在执行之后

12、,P仍然指向阵列串的第一个地址,并且在执行之后,P指向阵列元件串9的下一个存储单元。注意:数组名是一个地址常量,所以不能赋值或操作。示例:int a10如果程序中出现a或a-,那就错了。数组元素的引用方法,void main() int a5,*pa,I;对于(I=0;I 5;I)ai=I 1;pa=a。对于(I=0;I 5;i ) printf (*(pa %d):%dn,I,*(pa I);对于(I=0;I 5;i ) printf (*(a %d):%dn,I,*(a)I);对于(I=0;I 5;I)printf(pa 360% dn,I,pai);对于(I=0;I 5;I)printf

13、(360% dn,I,ai);例如: int a=1,2,3,4,5,6,7,8,9,10,* p=a,I;数组元素地址的正确表示:(A) int y,*p=,6,输出结果:5 6,void main () int i,*p,a7;p=a;对于(I=0;I 7;i ) scanf (%d,p);printf(n);对于(I=0;I 7;I,p ) printf (%d,* p);注意指针的当前值,p=a;指针变量可以指数组后面的存储单元。4.这些元素是指针数组_ _ _ _ _指针数组。当某个数组单元是指针数据时,这个数组称为指针数组。其定义的一般格式是:数据类型符号*变量名常量表达式;例如:

14、char c3=a、b、c;char * p3P0=,4。指针数组和数组指针的比较。示例使用指针数组将键盘输入的五个整数从小到大排序。#包括void main () int i,j,t。int a,b,c,d,e;/将a、b、c、d和e的内存地址分配给p0.p4分别为int *p5=和运行结果(假设输入:38764): 34678、注意:这个方法是交换对应于A、B、C、D和E的存储单元的值,但是指针数组保持不变Q:如果A、B、C、D和E的值不变,我们可以对它们进行排序吗?9.5指针和字符串1。字符串表示是通过字符数组来实现的,例如, void main () charstring=“我爱中国!

15、”;printf (%sn ,字符串);printf (%sn ,字符串7);跑步成绩:我爱中国!中国!通过字符指针实现,例如:void main () char * string=“我爱中国!”;printf (%sn ,字符串);string=7;而(* string)put char(string 0);字符串;字符指针初始化:将字符串的第一个地址分配给字符串char * string“我爱中国!”;*字符串!=0,跑步成绩:我爱中国!中国!2.字符指针变量和字符数组字符* cp带char str20字符串由几个元素组成,每个元素放一个字符;cp存储字符串的第一地址字符str20我爱中国;()char * cp我爱中国;()字符串是地址常量;Cp是地址变量cp。接受键入的字符串时,必须首先打开存储空间,如char str10scanf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论