C++ 两个“;常数;在c++;变量声明

C++ 两个“;常数;在c++;变量声明,c++,C++,我在win32 API编程教程中遇到了这段代码,我正在努力理解它 if (msg == WM_NCCREATE) { const CREATESTRUCTW* const pCreate = reinterpret_cast<CREATESTRUCTW*>(lParam); } 可接受答案的摘要如下: 正确的写入方式是GLvoid const*const*,正确的读取方式是从右向左,即: “它是指向指向GLvoid类型的常量对象的常量指针” 这让我更加困惑,因为无论我怎么

我在win32 API编程教程中遇到了这段代码,我正在努力理解它

if (msg == WM_NCCREATE) 
{
    const CREATESTRUCTW* const pCreate = reinterpret_cast<CREATESTRUCTW*>(lParam);
}
可接受答案的摘要如下:

正确的写入方式是
GLvoid const*const*
,正确的读取方式是从右向左,即:

“它是指向指向GLvoid类型的常量对象的常量指针”

这让我更加困惑,因为无论我怎么读,从右到左读都会读到:

“它是指向GLvoid(GLvoid)类型对象的常量指针(const*)的常量指针(const*)”

如果有人能用我的问题来解释它,那也太好了,即
const CREATESTRUCTW*const pCreate
。谢谢。

让我们重写一下

   const CREATESTRUCTW* const pCreate
为此:

   CREATESTRUCTW const * const pCreate
// <------- a -------> <- b ->
CREATESTRUCTW const*constpcreate
//  
意思是一样的


const
指的是左边的东西,所以你有一个不可变指针(
b
),它指向类型为
CREATESTRUCTW
a
)的不可变对象。

让我们把它拆开

  • CREATESTRUCTW*pCreate
    -
    pCreate
    是指向类型为
    CREATESTRUCTW
  • const CREATESTRUCTW*pCreate
    -
    pCreate
    是指向
    CREATESTRUCTW
  • const CREATESTRUCTW*const pCreate
    -
    pCreate
    本身就是const,一旦给它赋值,它就无法更改
const CREATESTRUCTW*const pCreate

指针pCreate不可修改,它指向的
CREATESTRUCTW
不能通过
pCreate
修改

即在声明之后:

pCreate = NULL ; // will fail to compile
而且:

pCreate->style = WS_BORDER ; // will also fail to compile
本质上,它为指针及其指向的对象提供只读保护

请注意,
CREATESTRUCTW
对象不能通过该指针进行修改,但可以通过指向同一对象的非常量指针进行修改

const GLvoid*const*索引

是指向
GLvoid
的常量指针的常量指针。这类似于
GLvoid**
,但是
索引
是不可修改的,
*索引
是可修改的。但是,
GLvoid
对象
**索引
是可修改的

正确的书写方式是GLvoid const*const*


这是胡说八道;这是另一种选择,但
const GLvoid*const*index
同样正确,而且更加惯用。这在观点上更容易理解。

有时声明可能很难理解。我认为使用螺旋规则可以帮助解密声明的含义。参见“C++/C螺旋规则”,如下所示
pCreate->style = WS_BORDER ; // will also fail to compile