我总是弄乱如何正确使用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放在类型右侧的一个原因,而且从不在开始时。