看明白了的回答。
关于const在声明中,的确很容易搞晕了,特别是
const int * const * const p;
到底是什么意思呢?
其实rule很简单:就三条
1. 永远从右往左读一个变量声明。
2. const永远修饰const出现地点左边的声明类型。
3. 如果左边没有声明类型,就修饰右边。
所以
const int * const * const p1; //两者是一致的
int const * const * const p2;
解释为:p2是一个const的指针(指针本身不能变),指向const的指针(指向的指针也不能变),指向const int,最终指向的内存区域是一个int变量,也不能变。
所以用标准写法,也就是第二种写法在理解上会方便一些。但是第一种写法过于普遍了,几乎所有代码都这么写。下次读的时候从右往左然后自动脑补最左边的const是修饰右边的类型就好。
const int * const * const p;
到底是什么意思呢?
其实rule很简单:就三条
1. 永远从右往左读一个变量声明。
2. const永远修饰const出现地点左边的声明类型。
3. 如果左边没有声明类型,就修饰右边。
所以
const int * const * const p1; //两者是一致的
int const * const * const p2;
解释为:p2是一个const的指针(指针本身不能变),指向const的指针(指向的指针也不能变),指向const int,最终指向的内存区域是一个int变量,也不能变。
所以用标准写法,也就是第二种写法在理解上会方便一些。但是第一种写法过于普遍了,几乎所有代码都这么写。下次读的时候从右往左然后自动脑补最左边的const是修饰右边的类型就好。
作者:Michael Zhang
链接:https://www.zhihu.com/question/24785843/answer/128565038
来源:知乎
这是轮子哥的回答:看不懂 先马克下来
顶层和底层的翻译很容易让人误解为就只有两层,实际上当然是不是的。首先我们假设有这样的代码:
template<typename T> using Const = const T;
template<typename T> using Ptr = T*;
然后
const int *** const shit = nullptr;
要怎么看呢?很简单,不要用const和*,用Const和Ptr来表达,马上明白:
Const<Ptr<Ptr<Ptr<Const<int>>>>> shit = nullptr;
一秒学会
作者:vczh
链接:https://www.zhihu.com/question/24785843/answer/238903938
来源:知乎