C语言指针学习谭浩强版_第1页
C语言指针学习谭浩强版_第2页
C语言指针学习谭浩强版_第3页
C语言指针学习谭浩强版_第4页
C语言指针学习谭浩强版_第5页
免费预览已结束,剩余30页可下载查看

下载本文档

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

文档简介

1、第8章善于利用指针&1指针是什么&2指针变量8.3通过指针引用数组&4通过指针引用字符串讨论一个问题:A、B和C三人约定住宿在某旅馆。A先到达旅馆,在服务台登记 了房间,房间号是2010o然后,A电话通知了B,但没有通知C。B怎样找到A呢?B可以直接到2010找到A.1变量的“直接访问”方式:按变量的地址(即变量名)存取变量值的方式。例如:int i=3;直接访问:2000H3变量i变变址k变 hti pointer讨论一个问题:A、B和C三人约定住宿在某旅馆。A先到达旅馆, 在服务台登记了房间,房间号是2010o然后,A电话通知了B,但没 有通知C。C怎样找到A呢?C

2、可以从旅馆的服务台査询到A的房号2010,间接找到A。2变量的“间接访问”方式将变量的地址放在另一个内存单元中,先到另一个内存单元中取得变量的地址,再由变量的地址找到变量并进行数据存取(见下图)。作用相当I _J艮务台J间接访问方式: i_pointeri2000H<=>3int i = 3fj = 6zk;定义特殊变量Upointeri_pointer=&i; 2000 *i_pointer=50; 2004 2008"将i的地址' 、存到这里 3020间接存取内存用户数据区变量i变肚j变址k变 hti pointer8J拒针是什么地址:内存中存储单元的

3、编号。指针:在C在语言中一个变量的地址称为该变量的“指针”。例如:int a; /*即为变量a的地址(指针)*/8.2指针变量&2d使用指针变量的例子&22怎样定义指针变量&2.3怎样引用指针变量&24指针变量作为函数参数8.2.1使用指针变的例子例&丄通过指针变量访问整型变量。#include <stdio.h> int main()pl <=> &aint a = 100zb=10; int *plz *p2;pl = &a;p2=&b;*pl <=> a/定义整型变量,并初始化/定义指向整

4、型数据的指针变量/为指针变量pl赋值/为指针变量p2赋值printf(,a=(Vbdzb=(Vbdn,/a/b);printf(,*pl=<Vbdz*p2=<Vbdn,/*plr*p2);return 0;8.2.2怎样定义拒针变»定义指针变量的一般形式为:类型*指针变量名; 如 int *plz *p2;int是为指针变量指定的“基类型” o基类型指定指钊变量可指向的变量类型o plzp2是指针变量名,而不是*plz*p2如pl可以指向整型变量,但不能指向浮点型变量。例如:int a ; float b ; int *p;p = &b ;正确8.2.3怎样引使p

5、指向a在引用指针变量时,给指针变量赋值。如:p = &3;引用指针变量指向的变量。如有p=&a; *p=l;*p相当于a则执行pintfC%d水p输出丄引用指针变量的值。如:printf(''%xrp);z以十六进制输出 a的地址A要熟练掌握两个有关的运算符:Pm 2010H2002010H8-2,3怎样引用指针变1、&取址运算功能:返回其后随变量的内存地址例:int *p ,m ; /*定义p为指向int类型变量的指针*/ m=200 ;p=&m ; /*将m的地址赋给指针变量p*/8.2.3怎样引用指针变A要熟练掌握两个有关的运算符:2. *

6、间接存取运算功能:返回其后随地址(指针变量值)中的变量值例:int *p,m ;p=&m ;/* p指向整型变量m*/*p=200 ; /*将200赋给指针变量p所指向的变量m*/8.2.3怎样引用指针变指针变量的赋值:变量的指针(地址)是一个无符号整数,可以将一个变量的 指针赋值给一个指针变量,但不能将一个整数直接赋值给一个指 针变量。1、用变量的地址给指针变量赋值(求地址运算符&)。例如:int a, b, *pl;pl = &a ;注意:变量的类型必须与指针变量的类型相同。2、用相同类型的指针变量赋值。例如:int a, *pl, *p2; pl = &a

7、 ;p2 = pl ;注意:指针变量若不赋值,则指针变量的值是随机的。3、例如:int *p ;p =NULL ;或p = 0 ;-指针变量赋空值NULL与不赋值的区别:(1)指针变量赋字值NULL,指向为0的单元,系统保证该 单元不作它用,表示指针变量值没有意义;用途:避免指针变量的非法引用,在程序中常作为状 态比较表示不指定P是指向哪一4. void水类型指针种类型数据的指针变量void *p;使用时要进行强制类型转换取指针变量所指向地址内容: 存指针变量所指向地址内容: 例如:main()48h 3 *n 2000u Q 9 p ,|200031004(1)0=%d , b = %(l

8、" , a,b);pint a = 5 , p = &a ;b = * p + 3 *p = 4 ;printf( “ a运行结果:a = 4,b = 8注意:即若出现在的右边或其他表达式中则为取内 容*卩若出现在的左边则为存内容例丿1:交换a,b两个数例82输入a和b两个整数,按先大后小的顺序输出日和b。#include <stdio.h>int main()<int *plz*p2z*pzafb;printf("please enter two integer numbers:"); sea nfC'od/od",p

9、l=&a; p2=&b;if(a<b) <p=pl;pl=p2;p2=p;printfCP = %d/b=%drrab); printf("max=<Vbd,min=<Vbdn'*pl*p2);return 0;#include <stdio.h>#include <stdio.h>void main()fvoid main() fint a = 5 , b = 8 ;int a = 5 , b = 8 ;int t ;int *pa = &“ , *pb = &b ;printf(ua= %d

10、, b = %dnn ,a ,b);int t;t = a;printf(ua= %d,b = %dnn ,a ,b);a = b ;t = *pa;b = t ;*pa = *pb ;printf(ua= %d , b = %dnn,b);*pb = t ;printf(ua= %d , b = %dnH 9a ,b);c直接访例题2:编写一个函数实现两个数的交换#include <stdio.h> void swap( int x , int y ) int I ;void mainQ不能实现两个数的交换swap( a , b );printf(ua = %d , b = %d

11、 nM 宀 b ); 参数之间是值传递,单向(从实参传递给形参)8-2.4指针变作为函数参数例题3:#include <stdio.h>void swap( int *x , int *y )能实现两个数的交换void mainQswap( &a , &b );printf(ua = %d , b = %d n” , a, b );4A10II20102B12不能实现两个数的交换例题3:#includc <stdio.h>void swap( int *x , int *y )void main()int a = 3 , b = 5 ;swap( &am

12、p;a , &b );printf(ua = %d , b = %d nM , a , b );c语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参数也要遵循这一规则。调用函数不可能改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。#includc <stdio.h>void swap( int *x , int *y )int *t ;t = x ; x = y ; y = t;void main()int a = 3 , b = 5 ;swap( &a , &b );printf(ua = %d , b = %d n

13、n , a , b ); 指针作为参数,地址传递的条件:1 实参和形参都是指针变量2被调函数中修改指针所指向的空间的值(即修改”p的值)void swap( int *x , int *y )void swap( int *x , int *y )能实现交换功能的函数 不能实现交换功能的函数void main()int a = 3 , b = 5 ;swap( &a , &b );printf(ua = %d , b = %d n" 5 a 5 b );int *t ;*t = *x ; *x = *v ; *yvoid mainQ#include <stdio

14、.h>void swap( int *x , int *y )有问题:指针变量t没有指向对象,语句存在危险#include <stdio.h>void swap( int *x , int *y )int a = 3 , b = 5 ; swap( &a , &b );printf(ua = %d , b = %d n” , a,bvoid mainQ能够实现两 个数的交换int a = 3 , b = 5 ;swap( &a , &b );printf(Ma = %d , b = %d nn ,a,b)指针变量说明表格例如:int a , *

15、pa ; pa = &a ;指针变量的种类指向变量的指针变量的值pa = &a指向对象的值表达形式pa = a指针变量水和&运算符的关系:互为逆运算要求:”后面必须是地址表达式,&后面是变量8.3通过指针引用数组8.3.1数组元素的指针&32在引用数组元素时指针的运算&33通过指针引用数组元素&34用数组名作函数参数&35通过指针引用多维数组8,3.1数组元素的拒针数组元素在内存中是连续存放的A个数组包含若干元素,每个数组元素都有相应的地址。 int a10;数组a中下标为i (假设i的取值合理)的数组元素的地址:&ai第

16、二种表达形式:C语言中数组中下标为0的数组元素地址为:数组名或数组名+ 0C语言中数组中下标为i的数组元素地址为:数组名+ i8.3J数组元素的指针A所谓数组元素的指针就是数组元素的地址。A指针变量可以指向数组元素(把某一元素的地址放到一 个指针变量中)。>可以用一个指针变量指向一个数组元素aEOa98.3.2在引用数组元素时拒针的运算A在指针指向数组元素时,允许以下运算:加一个整数(用+或+ = ),如P+1低>计算p+ E” <PP+ => p指向下一数据存储单元(向后移动4个字节)+:指针向高地址方向移动一个数据存储单元8-3-2在引用数组元素时指针的运算A在指针

17、指向数组元素时,允许以下运算:减一个整数(用或=),如p:lL低高p Ipp => p指向前一数据存储单元(向前移动4个字节)-:指针向低地址方向移动一个数据存储单元 注意:数据类型不同,指针增1和减1运算所引起的 地址变化量是不同的,指向的新地址为:原地址土 sizeof(类型说明符)例:int a32,i *p ;下标法对数组进行运算for(i=0;i<32;i+) scanf(u%dM,&ai); 指针法对数组进行运算P=a ;for(i=0;i<32;i+) scanf(u%dM,p+);例:int a10,*p ;P=&a2;计算:+p表达式值为&a

18、mp;a3,p的值为&a计算:p+表达式值为&a2,p的值为&a3832在引用数组元素时指针的运算A在指针指向数组元素时,允许以下运算:加减一个正整数n113/如p+n (或pn)例:float a5,*p1=&a0,*p2 ; p2=p1+3 ;三个数组元素低高aOJ|a3|指针向高地址方向移动n个数据存储单元,指向的新 地址为:原地址+sizeof(类型说明符)F指针变量减去正整数p-n (n为正整数)例:float a5,*p1=&a33*p2 ; p2=p1-2 ;帆1| 卜Plp2 2个数组元素指针向低地址方向移动n个数据存储单元,指向的新 地

19、址为:原地址-sizeof(类型说明符)F8-3-2在引用数组元素时指针的运算A在指针指向数组元素时,允许以下运算:自加运算,如p+ + , + + P自减运算,如p,P两个指针相减,女npl-p2 (只有P:L和p2都指向同一数组中的亍 素时才有意义)(1)如果指针变量P已指向数组中的一个元素,贝Ijp+l指向同一数组中的下一个元素,p-丄指向同一数组中的上一个元素。float a10z*p = a;假设a0的地址为2000,则 P的值为2000 P + 1的值为2004 丄的值为丄996越界(2)如果p的初值为&a0,贝ijp+i和a + i就是数组元素ai的地址,或者说,它们指向

20、a数组序号为啲元素若p=a .即:p+i 0 a + i 0 &ai(3) *(p+i)或*(a + i)是 p + i 或 a + i 所指向的数组元素,即 ai«若p=a .即:*(P+i) 0 *(a + i)(4)如果指针同一数组pl. + p2无意义。a0 al a2 a3 a4 a5 a6 a7 a8 a9地址,运算产生的结果为1和Oo如果两个指针变量指向同一个数组的元素,则两个指针变量之差表示两个指针指向的内存位置之间相隔多少个元素(注意是元素,并不是字节数)/(5)指针的关系运算=!=>>=指针的关系运算是两个指针所指向的地址之间的比较运算,相等,

21、为同一变量地址,否则,为不同变量的注意:指针应指向同一数组,否则比较无意义。不同类型指针之间的比较无意义;指针与整型常量或 整型变量的比较无意义,唯整数0例外(0表示空 指针)。判断pl,p2是否指向同一变量低地址高地址例:有定义:double a5,*pl,*p2 ;pl,p2指向如图所示计算:结果:0pl<p2指向前面元素的指针变量地址值小结果:1pl=NULL 或 pl=0 或!pl 判断pl是否为空指针 结果:0pl!=O 或 pl功能同上,结果相反 结果:1总结i个元素30ai第i个元素地址的表示(P的初值为a)a+i数组名法p+i指针法&a 订下标法&P订p=

22、a; p+; p=p+5;正 a=&a 5; a+ ;簡第i个元素值的表咚 (a+i) (p+i)a i用指针和数组名访问内存方式的重要区别:订a91 指针变量是地址变量,其指向由所赋值确定2数组名是地址常量(指针常量),恒定指向数组的第0个元素设 int a5 , *p = a ;2C00246801234a01 al a4地址关系:指针变量数组指针下标法下标法Pa& a01&p0P + 1a + 1&al&plp + 2a + 2&a2&P【2p + 3a + 3& a3&Pp + 4a + 4&a4&p4设 int a5 , *p = a ;2C00246801234a01ala4内容关系:指针法数组名下标法下标法*( P)*( a)a0p0*(p + 1)*( a + 1)alpl*(p + 2)*(a + 2)a2p2*( p + 3

温馨提示

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

评论

0/150

提交评论