const int *,const int * const和int const *之间有什么区别?
我总是搞砸了如何正确使用const int*
, const int * const
和int const *
。 是否有一套规则来定义你可以做什么和不可以做什么?
我想知道所有的做法和所有的要点,包括任务,传递给功能等。
向后读取(由顺时针/螺旋规则驱动):
int*
- 指向int的指针 int const *
- 指向const int的指针 int * const
- const指向int的指针 int const * const
- const int指针 现在第一个const
可以在类型的任一侧,如下所示:
const int *
== int const *
const int * const
== int const * const
如果你想变得非常疯狂,你可以做这样的事情:
int **
- 指向int **
指针的指针 int ** const
- 一个指向int的指针的const指针 int * const *
- 指向指向int的常量指针的指针 int const **
- 指向const int指针的指针 int * const * const
- 一个指向int * 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
是一个常数或固定指针,可指向可更改的值。 这就像没有额外语法糖的参考。 由于这个事实,除非需要允许NULL
指针,否则通常会使用T* const
指针的引用。
对于不了解顺时针/螺旋线规则的人:从变量名称开始,按顺时针方向移动(在这种情况下,向后移动)到下一个指针或类型 。 重复,直到表达结束。
这里是一个演示:
我想所有的东西都已经在这里回答了,但我只想补充一点,你应该小心typedef
s! 它们不只是文本替换。
例如:
typedef char *ASTRING;
const ASTRING astring;
astring
的类型是char * const
,而不是const char *
。 这是我总是倾向于将const
放在该类型右侧的原因之一,并且从不在开始。
上一篇: What is the difference between const int*, const int * const, and int const *?
下一篇: What is the difference between Public, Private, Protected, and Nothing?