协慌网

登录 贡献 社区

const int *,const int * const 和 int const * 之间有什么区别?

我总是弄乱如何正确使用const int*const int * constint const * 。是否有一套规则来定义您能做什么和不能做什么?

我想知道在任务,传递到职能等方面所做的所有事情和所有不应做的事情。

答案

向后读(由顺时针 / 螺旋规则驱动):

  • int* - 指向 int 的指针
  • int const * - 指向 const int 的指针
  • int * const - 指向 int 的 const 指针
  • int const * const - const 指向 const int 的指针

现在第一个const可以在类型的任何一侧,所以:

  • const int * == int const *
  • const int * const == int const * const

如果你想变得非常疯狂,你可以做这样的事情:

  • int ** - 指向 int 的指针
  • int ** const - 指向 int 的指针的 const 指针
  • int * const * - 指向 int 的 const 指针的指针
  • int const ** - 指向 const int 的指针
  • int * const * const - 指向int * const * const的 const 指针的 const 指针
  • ...

并确保我们清楚 const 的含义

const int* foo;
int *const bar; //note, you actually need to set the pointer 
                //here because you can't change it later ;)

foo是一个指向常量整数的变量指针。这使您可以更改指向的内容,但不能更改指向的值。大多数情况下会看到 C 风格的字符串,其中有一个指向const char的指针。您可以更改指向的字符串,但不能更改这些字符串的内容。当字符串本身位于程序的数据段中且不应更改时,这很重要。

bar是指向可以更改的值的常量或固定指针。这就像没有额外语法糖的参考。因为这个事实,通常你会使用一个引用来使用T* const指针,除非你需要允许NULL指针。

对于那些不了解顺时针 / 螺旋规则的人:从变量的名称开始,顺时针移动(在这种情况下,向后移动)到下一个指针类型 。重复直到表达结束。

这是一个演示:

指向int的指针

const指向int const的指针

指向int const的指针

指向const int的指针

const指向int的指针

我觉得这里已经回答了所有问题,但我只想补充一点,你应该提防typedef !它们不仅仅是文本替换。

例如:

typedef char *ASTRING;
const ASTRING astring;

astring的类型是char * const ,而不是const char * 。这是我总是倾向于将const放在类型右侧的一个原因,而且从不在开始时。