【翠字营】:const和指针组合 分析总结
来源:互联网 发布:星展造粉软件下载官方 编辑:程序博客网 时间:2024/05/20 10:53
一、可能的组合:
(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种组合
(1)char *p:可以对任意位置 (非系统 敏感区域)进 行读操作和写操作 。
(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";事实上在进程的栈内存里开辟了7个变量共10个字节的空间,其中6个字符变量的名字分别为:s1[0]、s1[1]、 s1[2]、s1[3]、s1[4]、s1[5](内容是'/0') ,他们共占了6个字节,还有一个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;" 不能通过*(s+i)='x'来修改数组元素s[0]~s[4]的值,但可以通过s[i]='x'来修改原数组元素的值。
(5)const char **p或者char const**p :涉及两个指针p和 *p。由于const修饰char ,对指针p没有任何限定,对指针*p进行了上面情况(2)的限定。
(6)char *const *p:涉及两个指针p和 *p。由于const修饰前面的char*,也就是对p所指向的内容*p进行了限定(也属于前面的情况(2))。而对*p来说,由于不能通 过"*p=..."来进行另外赋值,因此属于前面的情况(3)的限定。
(7)char **const p : 涉及两个指针p和 *p,const修饰p,对p进行上面情况(3)的限定,而对*p,没有任何限定。
四、关于char **p 、const char **p的类型相容性问题
1。问题
char *p1;const *p2=p1;//合法
char **p1;const char**p2=p1;//不合法,会有警告warning: initialization from incompatible pointer type
char **p1;char const**p2=p1;//不合法,会有警告warning: initialization from incompatible pointer type
char**p1;char*const*p2=p1;//合法
2。判断规则
明确const修饰的对象!对于指针p1,和p2,若要使得p2=p1成立,则可读做 :
“p1是指向X类型的指 针,p2是指向“带有const限定”的X类型的指针 “。
char *p1;const *p2=p1;//合法:p1是指向(char)类型的指针,p2是指向“带有const限定"的(char)类型的指针。
char **p1;const char**p2=p1;//不合法:p1是指向(char*)类型的指针,p2是指向 ((const char)*)类型的指针。
char **p1;char const**p2=p1;//不合法;与上等价。
char**p1;char*const*p2=p1;//合法: p1是指向(char *)类型的指针,p2是指向“带有const限定"的(char*)类型的指针。
- 【翠字营】:const和指针组合 分析总结
- 指针和const分析
- const和指针组合的变化
- const与指针组合
- 第十章 数组和指针(关键字const,指针分析数组属性)总结 140519
- C++中const和指针*的组合问题
- C和C++中const的区别,引用,一级指针和const组合
- const与指针总结
- 总结:指针、引用、const
- const指针用法总结
- const指针总结
- C++cosnt总结,捎带总结指针引用 define和const
- const引用和const指针
- const指针和const引用
- const数据和const指针
- C++ 指针与const的组合复习
- 浅析const与指针的组合
- 指向const的指针和const指针
- 学写BLOG
- 读写excel 的一个小方法
- ansys12.1
- GCC 安装
- ansys12.1
- 【翠字营】:const和指针组合 分析总结
- UI原稿图欣赏
- .NET初始准备阶段
- 复习——两种基于“交换”的排序方式
- PHP创建XML函数
- 串口驱动分析
- 打开WIM 文件
- AJAX(XMLHttpRequest)进行跨域请求方法详解(一)
- GIS科普系列(1)