C程序设计C程序设计 (70).pdf

上传人:刘静 文档编号:52835543 上传时间:2022-10-24 格式:PDF 页数:32 大小:661.96KB
返回 下载 相关 举报
C程序设计C程序设计 (70).pdf_第1页
第1页 / 共32页
C程序设计C程序设计 (70).pdf_第2页
第2页 / 共32页
点击查看更多>>
资源描述

《C程序设计C程序设计 (70).pdf》由会员分享,可在线阅读,更多相关《C程序设计C程序设计 (70).pdf(32页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、C C程序设计程序设计Programming in CProgramming in C指针的运算规则指针的运算规则1、指针的运算规则2、指针的限定C C程序设计程序设计程序设计程序设计3 37.2.5 7.2.5 指针运算指针运算2指针的关系运算设p1、p2是同一个指向类型的两个指针(常量或变量),则p2和p1可以进行关系运算,用于比较这两个地址的位置关系。例如:intint x x,y y,*,*p1p1=&=&x x,*,*p2p2=&=&y y;p2p2 p1p1/如果p2的地址值大于p1的地址值,则表达式为“真”,否则为“假”/如果p2的地址值大于p1的地址值,则表达式为“真”,否则为

2、“假”p2p2!=!=p1p1/如果p2的地址值不等于p1的地址值,则表达式为“真”,否则为“假”/如果p2的地址值不等于p1的地址值,则表达式为“真”,否则为“假”p2p2=NULLNULL/如果p2为0值,则表达式为“真”,否则为“假”/如果p2为0值,则表达式为“真”,否则为“假”4 47.2.5 7.2.5 指针运算指针运算关系运算对指向不同类型的指针之间是没有意义的。但是,一个指针可以和空指针作相等或不等的关系运算,用来判断该指针是否为0值,以确定是否可以间接引用该指针。例如,通常使用下面的代码避免无效的指针引用。ifif(p p!=!=NULLNULL).)./这里面引用*p/这里

3、面引用*p 5 57.2.5 7.2.5 指针运算指针运算3指针的类型转换设p是一个指针(常量、变量或表达式),可以对p进行显式类型转换,一般形式为:对指针进行显式类型转换的结果是产生一个临时指针对象,其指向类型为“转换类型”,地址值与p的地址值相同,但p的指向类型和地址值都不变。(转换类型转换类型*)*)p p6 67.2.5 7.2.5 指针运算指针运算【例7.7】输出一个short型数据的高、低字节。7 77.2.5 7.2.5 指针运算指针运算例7.71#include#include 2 intint mainmain()()3 4 shortshort x x,*,*p p=&=&

4、x x;5 unsigned charunsigned char hihi,lolo;6 scanfscanf(%d,&(%d,&x x););7 lolo=*(=*(unsigned charunsigned char*)*)p p););/Intel CPU低字节存储在前/Intel CPU低字节存储在前8 hihi=*(=*(unsigned charunsigned char*)*)p p+1 1););/Intel CPU高字节存储在后/Intel CPU高字节存储在后9 printfprintf(HI=%x,LO=%x(HI=%x,LO=%xnn,hihi,lolo););10 r

5、eturnreturn 0 0;11 8 87.2.5 7.2.5 指针运算指针运算例7.71#include#include 2 int main()int main()3 4 short x,*p=&x;short x,*p=&x;5 unsigned char hi,lo;unsigned char hi,lo;6 scanf(%d,&x);scanf(%d,&x);7 lo=*(unsigned char*)p);/Intel CPU低字节存储在前lo=*(unsigned char*)p);/Intel CPU低字节存储在前8 hi=*(unsigned char*)p+1);/In

6、tel CPU高字节存储在后hi=*(unsigned char*)p+1);/Intel CPU高字节存储在后9 printf(HI=%x,LO=%xn,hi,lo);printf(HI=%x,LO=%xn,hi,lo);10 return 0;return 0;11 HI=30,LO=3912345程序运行屏幕9 9指针变量p指向x(2个字节),为x输入12345后,x数据的十六进制形式为0 x3039,其内存形式如图所示。7.2.5 7.2.5 指针运算指针运算10107.2.5 7.2.5 指针运算指针运算4指针的赋值运算指针可以进行赋值运算,前提是赋值运算符两边的操作数必须是相同指向

7、类型。例如:intint x x=1010,*,*p1p1=&=&x x,*,*p2p2;p2p2=p1p1;/p1和p2均是int*/p1和p2均是int*p2p2=&=&x x;/&x和p2均是int*/&x和p2均是int*11117.2.5 7.2.5 指针运算指针运算还可以进行如下的复合赋值运算:intint i i=1 1,*,*p1p1=&=&i i;p1p1+=+=i i;/p1是指针变量,i是整型(常量、变量或表达式)/p1是指针变量,i是整型(常量、变量或表达式)p1p1-=-=i i;/p1是指针变量,i是整型(常量、变量或表达式)/p1是指针变量,i是整型(常量、变量或

8、表达式)12127.2.5 7.2.5 指针运算指针运算如果操作数不是相同的指向类型则不能进行指针赋值,这时可以先进行显式类型转换再赋值。例如:intint a a=1010,*,*p p;doubledouble b b=2020,*,*pfpf=&=&b b;p p=(=(intint*)*)pfpf;/(int*)pf和p均是int*/(int*)pf和p均是int*13137.2.5 7.2.5 指针运算指针运算指针显式类型转换后,并没有改变指向对象的类型。例如这里的b变量仍然是double型,尽管指针变量p2指向了它,但*p2的间接引用得到的并不是b转换成整型的结果,而是b存储在内存

9、中的低4个字节的整数值(b本身为8个字节)。当b是20时,内存中的数据为0 x4034000000000000(浮点数格式),因此*p2的结果是0(取低4个字节作为整型)。比较一下double型显式类型转换为int型。a a=(=(intint)b b;/a=20/a=20intint a a=1010,*,*p p;doubledouble b b=2020,*,*pfpf=&=&b b;p p=(=(intint*)*)pfpf;/(int*)pf和p均是int*/(int*)pf和p均是int*14147.2.5 7.2.5 指针运算指针运算5void*指针的运算特殊性void*指针不能

10、做指针算术运算,例如:原因是void*指针指向对象的类型不明确,因而也就无法确定指针运算后的指向。voidvoid*pv1pv1;pv1pv1+;+;/错误,pv1指向类型不明确/错误,pv1指向类型不明确15157.2.5 7.2.5 指针运算指针运算void*指针可以做关系运算,表示两个指针的地址值比较。void*指针可以指向其他任何类型,无需类型转换。假定指针是有效的,可以将void*指针显式类型转换为其他类型,再使用间接引用。例如:intint x x=1010;doubledouble y y=2020,*,*pfpf=&=&y y;voidvoid*pv1pv1;pv1pv1=&=

11、&x x;/无需指针类型转换/无需指针类型转换printfprintf(%d(%dnn,*(,*(intint*)*)pv1pv1););/void指针显示类型转换后再引用/void指针显示类型转换后再引用pv1pv1=pfpf;/无需指针类型转换/无需指针类型转换printfprintf(%lf(%lfnn,*(,*(doubledouble*)*)pv1pv1););/void指针显示类型转换后再引用/void指针显示类型转换后再引用16167.2.6 7.2.6 指针的指针的constconst限定限定const限定符作用在指针类型上有两种含义:指向const对象的指针和const指针。

12、17177.2.6 7.2.6 指针的指针的constconst限定限定1指向const对象的指针一个指针变量可以指向只读型对象,称为指向const对象的指针,定义形式为:即在指针变量定义前加const限定符,其含义是指针指向的对象是只读的,换言之,不允许通过指针来改变所指向的const对象的值。const 指向类型const 指向类型*指针变量指针变量,.;,.;18187.2.6 7.2.6 指针的指针的constconst限定限定例如:这里的p是一个指向const的int类型对象的指针,const限定了p指针所指向的对象类型,而并非p本身。也就是说,p本身并不是只读的,在定义时不需要对它

13、进行初始化。可以给p重新赋值,使其指向另一个const对象。但不能通过p修改其所指对象的值。const intconst int*p p;19197.2.6 7.2.6 指针的指针的constconst限定限定例如:const intconst int a a=1010,b b=2020;const intconst int*p p;p p=&=&a a;/正确,p不是只读的/正确,p不是只读的p p=&=&b b;/正确,p不是只读的/正确,p不是只读的*p p=4242;/错误,*p是只读的/错误,*p是只读的20207.2.6 7.2.6 指针的指针的constconst限定限定把一个c

14、onst对象的地址赋给一个非const对象的指针变量是错误的,例如:const doubleconst double pipi=3.143.14;doubledouble*ptrptr=&=&pipi;/错误,ptr是非const指针变量/错误,ptr是非const指针变量const doubleconst double*cptrcptr=&=&pipi;/正确,cptr是const指针变量/正确,cptr是const指针变量21217.2.6 7.2.6 指针的指针的constconst限定限定不能使用void*指针保存const对象的地址,而必须使用const void*指针保存const

15、对象的地址,例如:const intconst int x x=4242;const voidconst void*cpvcpv=&=&x x;/正确,cpv是const指针变量/正确,cpv是const指针变量voidvoid*pvpv=&=&x x;/错误,x是const/错误,x是const22227.2.6 7.2.6 指针的指针的constconst限定限定允许把非const对象的地址赋给指向const对象的指针,例如:const doubleconst double pipi=3.143.14;const doubleconst double*cptrfcptrf=&=&pipi;

16、/正确,cptrf是const指针变量/正确,cptrf是const指针变量doubledouble f f=3.143.14;/f是double型,f是非const/f是double型,f是非constcptrfcptrf=&=&f f;/正确,允许将f的地址赋给cptrf/正确,允许将f的地址赋给cptrff f=1.6181.618;/正确,可以修改f的值/正确,可以修改f的值*cptrfcptrf=10.110.1;/错误,不允许通过引用cptrf修改f的值/错误,不允许通过引用cptrf修改f的值23237.2.6 7.2.6 指针的指针的constconst限定限定不能使用指向co

17、nst对象的指针修改指向对象。例如:doubledouble f f,*,*ptrptr=&=&f f;const doubleconst double*cptrcptr=&=&f f;f f=3.143.14;/正确,f不是const,允许修改/正确,f不是const,允许修改*cptrcptr=3.143.14;/错误,cptr是const指针,不允许修改*cptr/错误,cptr是const指针,不允许修改*cptr*ptrptr=2.722.72;/正确,ptr不是const指针,允许修改*ptr/正确,ptr不是const指针,允许修改*ptr程序中,指向const的指针cptr实际

18、上指向了一个非const对象;尽管它所指的对象并非const,但仍不能使用cptr修改该对象的值。本质上来说,由于没有方法分辨cptr所指的对象是否为const,系统会把它所指的所有对象都视为const。24247.2.6 7.2.6 指针的指针的constconst限定限定如果指向const的指针所指的对象并非const,则可直接给该对象赋值或间接地利用非 const指针修改其值,毕竟这个值不是const的。重要的是要记住:不能保证指向const的指针所指对象的值一定不被其他方式修改。25257.2.6 7.2.6 指针的指针的constconst限定限定实际编程中,指向const的指针常用

19、作函数的形参。将形参定义为指向const的指针,以此确保传递给函数的实参对象在函数中不被修改。26267.2.6 7.2.6 指针的指针的constconst限定限定2const指针一个指针变量可以是只读的,称为const指针,定义形式为:指向类型指向类型*constconst 指针变量指针变量,.;,.;27277.2.6 7.2.6 指针的指针的constconst限定限定例如:可以从右向左把上述定义语句理解为“pc是指向int型对象的const指针”。intint a a=1010,b b=2020;intint*constconst pcpc=&=&a a;/pc是const指针/pc

20、是const指针28287.2.6 7.2.6 指针的指针的constconst限定限定任何企图给const指针赋值的操作,即使给pc赋回同样的值都会导致编译错误:与任何const量一样,const指针必须在定义时初始化。pcpc=&=&b b;/错误,pc是只读的/错误,pc是只读的pcpc=pcpc;/错误,pc是只读的/错误,pc是只读的pcpc+;+;/错误,pc是只读的/错误,pc是只读的29297.2.6 7.2.6 指针的指针的constconst限定限定指针本身是const的并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型。例如pc

21、指向一个非const的int型对象a,则可通过pc间接引用修改该对象的值:*pcpc=100100;/正确,a被修改/正确,a被修改30307.2.6 7.2.6 指针的指针的constconst限定限定3指向const对象的const指针可以定义指向const对象的const指针,形式为:const 指向类型const 指向类型*constconst 指针变量指针变量,.;,.;31317.2.6 7.2.6 指针的指针的constconst限定限定例如:可以从右向左理解上述定义:“cpc首先是一个const指针,指向double类型的const对象”。const doubleconst double pipi=3.141593.14159;const doubleconst double*constconst cpccpc=&=&pipi;/cpc为指向const对象的const指针/cpc为指向const对象的const指针结束结束

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com