好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

c++程序设计第6章指针剖析.ppt

90页
  • 卖家[上传人]:今***
  • 文档编号:107642122
  • 上传时间:2019-10-20
  • 文档格式:PPT
  • 文档大小:4.59MB
  • / 90 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1,第 6章 指针,清华大学出版社 张树粹 等编著,2,第 6章 主要内容,本章主要介绍: 在C程序设计中常常会用到指针,利用指针变量可以表示各种数据结构,能很方便地使用数组和字符串 指针与所指向数据的关系 如何引用指针指向的数据 指针变量传递数据 指针数组的应用等,3,6.1 地址、指针和指针变量的概念,程序中使用的数据指定内存单元存放,内存单元的大小以字节为单位,每一个内存单元有一个编号,称为“地址” 在“地址”所标识的内存单元中存放的数据就是“内容”,通过内存单元的地址就可以访问对应内存单元的内容,这时可以说某地址和相应的内存单元建立了映射关系 因此,地址也形象地叫做“指针”4,,在程序中定义了一个变量,系统会根据该变量的数据类型在编译时为其分配相应的内存单元,这时将内存单元的第1个字节的地址编号称为变量的地址(也称首地址) 如果将变量的地址作为一个特殊的数据(地址值)存入一个变量来保存,那么能接收地址值的这个变量称为“指针变量”,这时可以说“指针指向了该内存单元”,而且,通过指针也可以访问该内存单元的数据5,short int x=2 ; float y=3.0 ; char ch= ‘a’ ;,,,例如:,6,程序在执行时,CPU并不直接识别变量名,而是通过该变量的内存地址访问其值的。

      例如: int x=2;,这种在程序中直接按变量地址存取变量值的方式 称为“直接访问”方式其执行过程是: 根据变量名与内存地址的映射关系 先找到变量x的地址 然后将整数2存入,,,,,2,7,还有另外一种访问变量的方式称为“间接访问”方式例如:执行 int x=2;之后 想访问变量x的值2 将变量x的地址2000存入 到一个特殊的变量p中,2000,,,,,,,,,在间接访问方式中, 能够存放地址的变量 就叫做“指针变量”, 指针变量的值是指针8,6.2 指针变量的定义、赋值和引用,例如:,6.2.1 指针变量的定义,数据类型 *指针变量名;,指针变量p指向整型变量, 指针变量q指向单精度实型变量说明: (1)指针变量也占用内存单元,所有指针变量占用 内存单元的数量都是相同的(整型)2)“*”表示该变量为指针变量,以区别于普通 变量,而指针变量名并不包含“*”3)指针变量可以指向任何类型的对象,包括数组、指针变量、函数或结构体类型变量等,从而可以表示复杂的数据类型4)寄存器变量不可使用指针9,6.2.2 指针变量的赋值,指针变量在使用之前必须赋给一个确定的地址值, 指针变量指向简单变量的运算有以下几种形式:,float f; float *q= //指针q指向f,,(1)初始化赋值方式(声明变量时直接赋值叫初始化 ),int i,*x= // 将指针x初始化赋值,x指向i,short int a,*p= //指针 p指向a,,,注意:C语言中int型占两个字节,C++ 中int型占4个字节,2000 (&i),,3000 (&a),,,,4004 (&f),指针变量所占用的内存字节数等同int型字节数(2或4),10,(2)赋值语句直接赋值方式 int a,*pa; pa= //将a的地址赋给指针变量pa,,3000 (&a),,指针没有赋值时, 其指向是随机的,,指针pa指向a,11,(3) 通过指针变量给相同类型的指针变量赋值方式。

      int a,*pa= // pa,pb,可以进行赋值运算,,3000 (&a),,,3000 (&a),,12,,注意: 1.指针没有赋值时,其指向是不定的, 使用指向未定的指针变量,常常会破坏内存中其他单元的内容,严重时会造成系统失控 2.可以把指针变量初始化为空指针例如: #define NULL 0 int *p=NULL; 3. NULL的值是整数0,使p指向起始地址为0的单元系统保证该单元不存放有效数据 空指针的概念与指针变量未赋值的概念完全不同13,6.2.3 指针的引用,1.& 地址运算符 使用方式:&变量名 作用是取得变量所占用的存储单元的首地址,在利用指针变量进行间接访问某个变量之前, 必须将该变量的地址赋给指针变量,char ch, *pc = ,14,,2.* 指针运算符 使用方式: *指针变量名 作用是取指针变量所指向的数据单元的值, 即通过指针变量来间接访问它所指向的变量 (指针指向的变量),short int i=10,*p=,,2000 (&i),,10,,,,,,,,,,*p,,10,-,15,注意: *在指针变量定义时出现和程序运算过程中出现,含义是不同的,,在定义时的“*” 是为了区分简单变量与指针变量 表示定义的变量类型是指针型,不是运算符, 在程序执行语句中的 “*” 是指针运算符 它表示指针指向的变量。

      short int i=10, *p = // *是指针运算符,16,3.& 和 *间的运算,&和*是同一优先级别的,结合性都是自右至左 可以进行复合运算,int i=10,*p=,2000,10,*&i,,,,,&*p,,,,,,*p,,2000,==i,==p,*&p,==p,&*i,错,17,void main(){ short int i,*pi; pi= },【例6.1】指针变量的引用举例5,,(*pi),5,5,_,6,6,,6,,_,,5555,,22,3000,18,6.3 指针的运算,6.3.1 指针的赋值运算和算术运算 指针变量可以重新赋值,即改变指向指针的算术运算都是按C语言的地址计算规则进行的,这种运算与指针指向的数据类型有密切关系指针运算的种类是有限的, 除其特有的两种运算符 & 和 * 外, 它只能进行算术运算、关系运算和赋值运算19,1. p++(或++p)、p--(或--p),指针自增(减)运算是地址运算, 即指针加1(减1)的结果是 指针指向下一个(上一个)数据地址20,short int i,*pi=,,,,i,2000 (&i),,ch,2010 (&ch),,,,f,2030 (&f),,,(*pi),(*pc),(*pf),2002,,(*pi),,2011,,,(*pc),,2034,,,(*pf),,,21,2. *p++ 和(*p)++,这是个复合运算问题,* 和++(--)是同级别并结合性相同的运算符 *p++ 和(*p)++ 的不同之处在于: ① *p++ 表示先取指针p指向的变量*p的值,然后对指针变量p作自加运算, ② (*p)++ 表示先取指针p指向的变量 *p的值,然后对指针p指向的变量*p作自加运算。

      22,例如,,short i=5, j; short *p=,,i,(*p),,j,2000 (&i),,,5,8888,,,等价于 j=*p; p++;,,,,j= *p++ ;,j= (*p)++ ;,2002,,(*p),,等价于 j=*p; (*p)++;,,,6,5,5,23,3. *++p和++(*p),复合运算*++p和++(*p)的不同之处在于: ① *++p表示先使指针变量p作自加运算,改变指针的指向,然后取p当前所指变量*p的值 ② ++(*p)表示先使p指向的变量*p的值作加1运算,然后取出该值24,short i=5, j; short *p=,j= * ++ p ;,j= ++ (*p) ;,,i,,,j,2000 (&i),5,(*p),,等价于 ++ p; j=*p;,,2002,(*p),,,?,,?,,,等价于 ++(* p); j=*p;,,6,,8888,6,25,比较:,26,4. p+n、p-n(其中n为整型常量),将指针p加或减一个整数n, 表示p向当前地址后方或前方移动n个数据单位, 每个数据单位的字节数取决于指针的数据类型short i ; short *p=,p=p+2;,,(*p),i,2000 (&i),float i ; float *p=,,,,2004,,(*p),,,i,2008,,,(*p),27,5. p-q(p,q为同一类型的指针),设p和q是指向同一数组中的元素,当p位于后, q位于前,则p-q表示p所指元素和q所指元素之间 的元素个数。

      28,【例6.2】 同一类型指针相减举例,#include void main() { float x[5],*p,*q; p= },q-p= 3,_,29,6.3.2 指针的关系运算,指针的关系运算包括:、=、、=、==、!= 两个同类型的指针,关系运算的结果反映出两个指针指向的变量的存储位置之间的前后关系int a[10],*p,*q; p= pq结果为假, p++==q结果为假, p!=q结果为真, p=&a[6]结果为真30,,说明: 1.指向不同数据类型的指针变量之间不能进行关系运算,无意义 2.任何指针变量或地址都可以与NULL作关系运算,通常是使用p==NULL或p!=NULL31,6.4 指针与一维数组,在C语言中,指针与数组有着十分密切的关系访问数组元素有两种方法:即下标法和指针法任何能由数组下标完成的操作都能由指针来实现,而且使用指针比用下标对数组元素的存取操作更方便,速度更快 数组元素的指针是数组元素的地址,数组元素的地址是指它所占内存单元的首地址32,元素的地址也是元素的指针, 表示为a+i ,下标法是采用“ [ ]”的形式引用数组中的元素;指针法采用“*”的形式引用数组中的元素。

      int a[10], *p; p=a; (或p= ),,,数组名代表数组的首地址,,p+0指向a[0] (p=a) p+1指向a[1] (p+1==&a[1]) p+2指向a[2] p+i指向a[i] (p+i==&a[i]) a[i] *(p+i) 下标运算的原理和指针运算的原理是一样的 *(p+i) p[i],,,33,表6.2 指针p与一维数组a的关系,34,(1)通过指针变量的移动访问数组元素 void main() { int a[10],i; *p; for(i=0;ia[i] ; for(p=a;pa+10; p++ ) cout*p“ “; },【例6.3】采用指针法输出数组的全部元素a,,,0,,,2 6 3 8 1 5 7 0 4 9 ↙,,,,2,6,3,8,1,5,7,0,4,9,10,,_,a,*p,,2,_,a+1,,*p,6,_,a+2,,*p,3,_,a+3,,*p,8,_,a+4,,*p,1,_,a+5,,*p,5,_,a+6,,*p,7,_,a+7,,*p,0,_,a+8,,*p,4,_,a+9,,*p,9,_,a+10,,*p,,35,,(2)指针变量p指向数组指向首地址不动, 用p+i方式访问数组元素(同样是变址运算),void main() { int a[10],i; int *p=a; for(i=0;ip+i ; for(i=0;i10;i++) cout *( p+i ) “ ”; },p,,i,a,,,,2 6 3 8 1 5 7 0 4 9 ↙,2,6,3,8,1,5,7,0,4,9,2,6,3,8,1,5,7,0,4,9,,a,,0,0,,,,p+i,,1,2,3,4,5,6,7,8,9,10,,,*(p+i),0,1,2,3,4,5,6,7,8,9,10,36,【例6.4】采用指针法从键盘输入10个整型数 并输出其中的最大值,void main() { int a[10],i,max,*p; p=a; for(i=0;ip++; max=a[0]; for(p=a;pmax) max=*p; cout“max=“max; },a,2 6 3 8 1 5 7 0 4 9 ↙,,,,,max=9,2,6,3,8,1,5,7,0,4,9,,,。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.