【问题标题】:Position of const keyword [duplicate]const关键字的位置[重复]
【发布时间】:2013-02-15 22:01:24
【问题描述】:

C中以下三个指针声明有什么区别:

void * const myPointer1;
void const *myPointer2;
const void *myPointer3;

又是用哪一种来预防的:

myPointer = somethingElse;

【问题讨论】:

  • 别告诉我你试图研究它却没有发现任何东西。
  • 不要错过const void * const myPointer; :)
  • @LihO 我做了,但没有发现纯 C(不是 C++ 或 ObjC),而且是简单的指针类型,没有混合函数。

标签: c


【解决方案1】:

从右到左阅读规则:

void * const myPointer1;

myPointer1 是一个指向voidconst 指针。

void const *myPointer2;

myPointer2 是指向 const void 的指针。

const void *myPointer3;

myPointer3 是指向 void const 的指针。

结论:

  • myPointer1 就是你要找的——它是一个 const 指针,所以它的值不能被修改
  • myPointer2myPointer3 是同一个东西
  • myPointer2myPointer3 有点毫无意义——取消引用 void* 没有意义

【讨论】:

  • 你的类型 2 和 3 (const void *) 非常有意义,如果你想从另一个 const 指针赋值,比如const char * s = "..."; const void * vp = s;
【解决方案2】:

在某些地方,您可以将 const 放在声明为 const 的任何内容之前:

const int * x;  // pointer to constant int

你可以总是const放在之后任何声明的常量:

int const * x;       // pointer to constant int
int * const x;       // constant pointer to int
int const * const x; // constant pointer to constant int

因此,我个人的建议是,始终后跟 const,因为这是唯一可以始终遵守的“规则”。

【讨论】:

    【解决方案3】:
    1. void * const myPointer1; = 将 myPointer1 声明为 指向 void 的常量指针
    2. void const *myPointer2; = 将 myPointer3 声明为 指向 void const 的指针
    3. const void *myPointer3; = 将 myPointer3 声明为 指向 const void 的指针

    每当有这样的疑问,你可以使用::cdecl.org

    您应该尝试 myPointer1 来避免您解释的情况,因为它是 const pointer

    【讨论】:

    • 顺便说一句。 cdecl.org 不支持“void const *myPointer2;”。这就是我登陆此页面的原因,谷歌搜索以确认我记得的内容,方式 2 与方式 3 相同。
    【解决方案4】:
    • myPointer1 是一个指向 voidconst 指针。
    • mypointer2myPointer3 都是指向 const void 的指针。

    myPointer2myPointer3 声明之间的区别只是样式问题。

    注意:const void 在这里表示指向的数据是const。例如,int main(void)void 无关。

    【讨论】:

    • void 类型(或const void)的含义是什么?例如,可以将什么分配到该指针指向的地址(*mypointer2 = ?
    • @icepack:void * 是“通用指针”,即“指向任何东西的指针”。您可以为其分配另一个指针的值,例如mypointer = otherpointer。但是,您不会为 dereferenced 指针赋值。
    • @DevSolar 是的,我知道这一点。我想知道“指向无效的指针”的语义含义。在我看来,这样的描述在逻辑上是不正确的。 void 这里是“anything”的别名,与void 的正常含义形成对比。
    • @icepack:不,它是一个“空指针”:指针本身是存在的,但它没有指向任何东西(可用)。您可以将其转换为不同的指针类型,并使用 that 进行进一步处理。 (请参阅malloc()。)因此,“void”的使用并不像看起来那样被误导。
    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 2012-11-06
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2013-10-07
    • 2019-01-05
    • 2017-06-29
    相关资源
    最近更新 更多