资源描述:
《C语言课件-第9章 指针.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、主要内容:(1)指针变量的定义和使用;(2)用指针实现函数参数的引用传递;(3)用指针实现动态存储分配的方法;(4)用指针和结构体管理单链表;(5)指针与数组的关系。第8章指针指针是C语言的一个重要概念,它是C语言的精华之一。特点是:调用函数时可实现变量的引用传递。用间接访问的方式改变数据的逻辑顺序。它能直接对内存地址操作,使用灵活。实现动态存储管理。可以使程序简洁、紧凑、高效。容易产生副作用,初学者容易出错。inti=3;floatj=6;doublek=9;36.09.0变量i变量j变量k2200220622022214程序中定义的变量,系统根据它的类型给
2、它分配一定长度的内存单元,该内存单元的起始地址即为变量的地址。该内存单元的内容就是变量的值。变量的地址和变量的值9.1地址和指针的概念内存是编址连续的,基本单位是字节。用户数据区直接访问和间接访问1.直接访问:用变量名直接从它对应的地址存取内容。如:intx=5,y=8,z=0;z=x+y;580变量x变量y变量z22002202220413直接从x和y对应的地址2200和2202取出内容5和8然后相加将结果13存入变量z对应的地址2204的单元中。2.间接访问:定义一个存放地址的变量p(p的地址1500),将x的地址2200存放在变量p中。通过变量p取出地址
3、2200,再按此地址存取其中的内容,就间接的完成了对x的存取。当p的内容改为2202时,通过变量p取出地址2202,再按此地址,存取的就是变量y的内容。p就是指针变量580变量x变量y变量z22002202220422001500变量p2202地址称为指针,变量的地址就是变量的指针。存放地址的变量,也就是存放指针的变量,称之为指针变量。9.2指针变量一般形式:基类型名*指针变量名;说明:基类型名:指针变量所指向的变量的类型名称指针变量名:所定义的指针变量的名称*:表示它后面的变量名是指针类型功能:(1)定义该指针变量名为指向基类型的指针变量,为该变量分配存储单
4、元,其长度等于存储地址的字节数。(2)基类型确定用指针变量“间接”存取数据的存储单元个数和存储形式。该变量只能指向基类型数据。指针变量的定义char*p1;int*p2;指针变量的初始化用=&变量名来给指针变量赋初值。选项中的变量名必须是已定义过的,其类型必须与基类型一致。表示将它对应的地址值赋给所定义的指针变量。可以用赋值语句给指针变量赋值:floaty,*py;py=&y;例如:intx,*p=&x;/*p为指向整型变量x的指针变量*/intpx=&x;/*不正确,缺指针定义符*号*/float*pf=&x;/*pf为指向实型变量的指针变量*//*初值指向
5、类型不匹配,x为整型变量*/指针变量的引用1.与指针相关的运算符(1)&:取地址运算符,取右边变量的地址(2)*:指向运算符(间接访问运算符),访问*右边的指针变量所指向的变量。&a是变量a的地址*p是指针变量p指向的变量。说明:“&”和“*”都是单目运算符,它们的优先级相同,按自右而左方向结合。如果已定义floata,*p=&a;则*p是变量a&*p是变量a的地址p&*p等价于p而&a是变量a的地址p*&a是p所指向的变量a*&a等价于a注意:指针变量定义的“*”(指针类型定义符)和引用指针变量的“*”(指向运算符)含义不同。floata;float*p=&
6、a;p=&a;*p=a;*p=&a正确正确正确错误2.指针变量的引用(1)引用指针变量的值(指针)与引用其它类型的变量一样直接用它的变量名(2)引用指针变量所指向的变量时,用“*指针变量名”注意:①指针变量的值与它所指向变量的值之间的差别②指针变量只有正确赋值后才能通过它访问指向的变量。xintx;pp=&x;&xint*p;*p*p=5;5注意事项:(1).指针变量定义和引用指向变量的“*”含义有差别。(2).不能引用没有赋值的指针变量,不要误认为p定义后变量*p就已存在,必须给p正确赋值后,变量*p才存在。(3).p=&a;是给指针变量p赋值,*p=3;是
7、给p指向的变量赋值。两者含义完全不同。(4).给指针变量赋值必须用同类型的指针。(5).指针变量只存放地址,地址值是无符号整数,但不能直接用整型量(或其它非地址量)赋值给指针变量。int*p1=2200;错误3.两种访问变量的方式(1)直接访问:直接引用变量名如:inti;i=5;(2)间接访问:通过指针变量和指向运算符来引用如:inti,*p;p=&i;*p=5;pppiii&i&i5*p*pmain(){intm,n;int*p=&m,*q=&n;printf(“inputm,n:");scanf("%d%d",p,&n);printf("m=%d&m=%
8、X",m,&m);printf("