网站大量收购闲置独家精品文档,联系QQ:2885784924

深入理解const charp,char constp,char const p,const char p,char constp,char constp,charconst p.docx

深入理解const charp,char constp,char const p,const char p,char constp,char constp,charconst p.docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
深入理解const charp,char constp,char const p,const char p,char constp,char constp,charconst p

深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p一、可能的组合:(1)const char*p(2)char const*p(3)char *const p(4)const char **p(5)char const**p(6)char *const *p(7)char **const p当然还有在(5)、(6)、(7)中再插入一个const的若干情况,不过分析了以上7中,其他的就可类推了!二、理解助记法宝:1。关键看const 修饰谁。2。由于没有const *的运算,若出现const *的形式,则const实际上是修饰前面的。比如:char const*p,由于没有const*运算,则const实际上是修饰前面的char,因此char const*p等价于const char*p。也就是说上面7种情况中,(1)和(2)等价。同理,(4)和(5)等价。在(6)中,由于没有const*运算,const实际上修饰的是前面的char*,但不能在定义时转换写成 const(char *)*p,因为在定义是()是表示函数。三、深入理解7种组合(0)程序在执行时为其开辟的空间皆在内存(RAM)中,而RAM里的内存单元是可读可写的;指针只是用来指定或定位要操作的数据的工具,只是用来读写RAM里内存单元的工作指针。若对指针不加任何限定,程序中一个指针可以指向RAM中的任意位置(除了系统敏感区,如操作系统内核所在区域)并对其指向的内存单元进行读和写操作(由RAM的可读可写属性决定);RAM里内存单元的可读可写属性不会因为对工作指针的限定而变化(见下面的第4点),而所有对指针的各种const限定说白了只是对该指针的读写权限(包括读写位置)进行了限定。(1)char *p:p是一个工作指针,可以用来对任意位置(非系统敏感区域)进行读操作和写操作,一次读写一个字节(char占一个字节)。(2)const char*p或者char const *p(因为没有const*p运算,因此const修饰的还是前面的char):可以对任意位置(非系统敏感区域)进行“只读” 操作。(“只读”是相对于char *p来说所限定的内容)(3)char *const p(const 修饰的是p):只能对“某个固定的位置” 进行读写操作,并且在定义p时就必须初始化(因为在后面不能执行“p=..”的操作,因此就不能在后面初始化,因此只能在定义时初始化)。(“某个固定的位置”是相对于char *p来说所限定的内容)可以总结以上3点为:char *p中的指针p通常是”万能”的工作指针,而(2)和(3)只是在(1)的基础上加了些特定的限制,这些限制在程序中并不是必须的,只是为了防止程序员的粗心大意而产生事与愿违的错误。另外,要明白“每块内存空间都可有名字;每块内存空间内容皆可变(除非有所限) ” 。比如函数里定义的char s[]=hello;事实上在进程的栈内存里开辟了6个变量共6个字节的空间,其中6个字符变量的名字分别为:s1[0]、s1[1]、 s1[2]、s1[3]、s1[4]、s1[5](内容是\0){待验证:还有一个4字节的指针变量s 。不过s是“有所限制”的,属于char *const类型,也就是前面说的 (3)这种情况,s一直指向s[0], 即(*s==s[0]==h),可以通过*s=k来改变s所指向的 s[0]的值,但不能执行(char *h=“aaa”;s=h;)来对s另外赋值。}(4)上面的(2)和(3)只是对p进行限定,没有也不能对p所指向的空间进行限定,对于char s[]=hello;const char*p=s; 虽然不能通过*(p+i)=x或者p[i]=x来修改数组元素s[0]~s[4]的值,但可以通过*(s+i)=x或者s[i]=x来修改原数组元素的值--RAM里内存单元的可读可写属性不因对工作指针的限定而改变,而只会因对其本身的限定而改变。如const char c=‘A’,c是RAM里一个内存单元(8字节)的名字,该内存单元的内容只可读,不可写。(5)const char **p或者char const**p :涉及两个指针p和 *p。由于const修饰char ,对指针p没有任何限定,对指针*p进行了上面情况(2)的限定。(6)char *const *p:涉及两个指针p和 *p。由于const

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档