学习C ++:为什么这是非法的?

时间:2017-09-10 13:34:23

标签: c++ pointers

几天前我买了C ++ Primer书,我开始学习这门新语言了!

目前,我试图理解为什么我自己写的这个块是非法的:

我将const int初始化为512; 我初始化一个const int const指向n; 但它不允许我创建一个指向指针的const int const指针,即使使用正确的双**和所有内容:

const signed int n = 512;
const signed int *const nPointer = & n;
const signed int **const nPointer2 = & nPointer;

有人有简单的解释吗?谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

为了修复代码,您有两个选择:

//Option one : 
const signed int *const nPointer = & n;
const signed int *const *const nPointer2 = & nPointer;
//Option two :
const signed int * nPointer = & n;
const signed int **const nPointer2 = & nPointer;

说明:

当nPointer是一个指向T的常量指针时,nPointer2应指向一个指向T的常量指针,如第一个选项中所示。或者,当nPointer2是指向T的非const指针的指针时,指针nPointer也应该是非const的。

当您到达本书中您定义自己的类型别名的部分时,您可以删除混乱,看看这些替代方法如何工作如下:

//simplifying notation:
using myType = const signed int *;
using myTypeC = const signed int * const;

//your code equivalent to:
myTypeC nPointer = & n;
myType *const nPointer2 = & nPointer;

//Option One:    
myTypeC nPointer = & n;
myTypeC *const nPointer2 = & nPointer;
//Option Two:    
myType nPointer = & n;
myType *const nPointer2 = & nPointer;

答案 1 :(得分:0)

首先简化问题并删除签名。问题保持不变 其次,使用编译器并读取ERROR消息。这适用于所有语言,而不仅仅是C ++ 问题出在这里:

const int **const nPointer2 = & nPointer;

nPointer类型是const signed int * const

你的指示是

const signed int **const nPointer2 = & nPointer;

所以你得到以下信息:

  

错误:从'const int * const *'无效转换为'const int **'

如你所见,const介于你的两颗星之间。创建编译错误。

正如您所看到的那样使用&把*放在结束