博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
const 与 指针的各种结合
阅读量:2028 次
发布时间:2019-04-28

本文共 1870 字,大约阅读时间需要 6 分钟。

const char *p, char const *p, char *const p

来吧,能不能一口气说下来这个玩意具体表示的是啥?


一个一个来看。。

const char *p(指向字符的指针常量):P指向的目标空间内容不可变,P的值(P的指向)可变。

char *const p(指向字符常量的指针): P的值(P的指向)不可变,P指向的空间内容可变。

char const *p : 等同于const char *p

const char **p是一个指向指针的指针,那个指针又指向一个 字符串 常量

char **p也是一个指向指针的指针,那个指针又指向一个 字符串 变量。


上面算是热身吧,,下面还有更猛的。。。

const char *p; //*p是const,p可变

const (char *) p;//p是const,*p可变

char* const p; //p是const,*p可变

const char* const p; //p和*p都是const

char const * p;// *p是const,p可变

(char*) const p;//p是const,*p可变

char* const p;// p是const,*p可变

char const* const p;// p和*p都是const


这东西,似乎马上记住,马上忘得活。。。咋弄啊?


Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:

把一个声明从右向左读。

char * const cp; ( * 读成 pointer to) cp is a const pointer to char

const char * p; p is a pointer to const char

char const * p; 同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。

幸亏还有get到一个网友的奇技淫巧

方法也是从右向左一步一步来解释,而且每一步都有返回值,是的你没看错,有返回值。每一步都相当于一个函数,上一步的返回值即是下一步的入参

拿const char *p;

1,“p”:代表内存的一块空间,暂且称为”内存1”, 返回值当然是p了,也就是内存1。

2, “*” :当p被星了之后,就跳到新的内存位置,也就是“内存2”。 内存2就是我们说的*p, 这时返回值就是内存2。

3,“char”: 因为上一步的返回值是内存2,所以这个char就作用在内存2上,就像是在说这里存的是一个char类型数据。

返回值还是内存2。

4,“const”:上一步返回内存2(具有char特点的内存2),这时const就作用在内存2上,结果就是说内存2不能变了,他是常量。返回值还是内存2(具有char特点和const特点的内存2)。

5,如果前面还有修饰符,应该可以这样再推下去


拿const (char *) p;

1, “p”:代表内存的一块空间,称为”内存1”,返回值当然是p,也就是内存1。

2, “(char*)”: 整个修饰p,因为不是*,不会跳转到新的内存,所以返回值还是p,还是内存1。

那“(char* )”什么意思呢,他相当于是一个自定义类型,就像一个自定义函数,简称大函数,由两个小函数构成。

函数1是“*”,函数2是“char”。

函数1“*”的处理结果是跳到另一块内存,即内存2,返回值是内存2。

函数2“char”的处理结果是说内存2是char类型,返回值是内存2。

只可惜这个返回值被大函数隔离了,大函数作为一个整体返回的是入参的那块内存。

如果有一天这个大函数只有一个小函数,这个小函数是“※”,即大函数数“(※)”,这时别以为“※”和“(※)”有什么区别,就是差个马夹而已。

3,“const”:修饰上一步返回的内存,即内存1


注意

不要被这里的内存1,内存2诱导,并给他们开辟空间了,声明时是不开辟空间的。

只有在实际赋值之后,内存1,内存2才有对应的实际的内存空间。

所以声明,只是在使用之前先描述一下这个变量具有什么特点,如何来使用这个变量而已。

所以不管是说内存1是const,或内存2是const,并不是说实际的那块内存真的就不能改了(实际上也做不到)。

这里对声明的变量赋值实际上是提供了对某块内存访问的一个方法。Const,char都是描述了这个方法的一些特点;而“*”的作用是跳转到另一块内存。


参考:

感谢博主的

转载地址:http://vmnaf.baihongyu.com/

你可能感兴趣的文章
WebCollector爬虫的各种参数配置(代理、断点等)
查看>>
WebCollector爬虫使用内置的Jsoup进行网页抽取
查看>>
WebCollector爬虫的数据持久化
查看>>
在WebCollector爬虫中,自定义http请求
查看>>
WebCollector爬虫的redis插件
查看>>
用WebCollector爬取网站的图片
查看>>
WebCollector提供免费代理
查看>>
spring教程(spring学习资料)列表(持续更新)
查看>>
Nutch教程中文翻译1(官方教程,中英对照)——Nutch的编译、安装和简单运行
查看>>
我和权威的故事——王垠
查看>>
开发网络爬虫应该怎样选择爬虫框架?
查看>>
用WebCollector 2.x爬取新浪微博(无需手动获取cookie)
查看>>
WebCollector教程——获取当前深度
查看>>
WebCollector网页正文提取
查看>>
Python文本分类服务 — klassify
查看>>
Python机器学习教程——逻辑回归
查看>>
Windows下运行C语言版Word2Vec训练词向量
查看>>
专知原创和整理了一些中英文机器学习从入门到精通的资料,和大家分享一下
查看>>
WebCollector 2.72自定义Http请求插件(定制User-Agent和Cookie等请求头)
查看>>
WebCollector 2.72处理301/302重定向、404 Not Found等Http状态
查看>>