我总是弄乱如何正确使用const int*
, const int * const
和int 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
指针。
对于那些不了解顺时针 / 螺旋规则的人:从变量的名称开始,顺时针移动(在这种情况下,向后移动)到下一个指针或类型 。重复直到表达结束。
这是一个演示:
我觉得这里已经回答了所有问题,但我只想补充一点,你应该提防typedef
!它们不仅仅是文本替换。
例如:
typedef char *ASTRING;
const ASTRING astring;
astring
的类型是char * const
,而不是const char *
。这是我总是倾向于将const
放在类型右侧的一个原因,而且从不在开始时。