4 回答
TA贡献2021条经验 获得超8个赞
向后读(由顺时针/螺旋规则驱动):
int*
- 指向int的指针int const *
- 指向const int的指针int * const
- const指向int的指针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 int* foo;int *const bar; //note, you actually need to set the pointer //here because you can't change it later ;)
foo
是一个指向常量整数的变量指针。这使您可以更改指向的内容,但不能更改指向的值。大多数情况下会看到C风格的字符串,其中有一个指向a的指针const char
。您可以更改指向的字符串,但不能更改这些字符串的内容。当字符串本身位于程序的数据段中且不应更改时,这很重要。
bar
是一个指向可以更改的值的常量或固定指针。这就像没有额外语法糖的参考。因为这个事实,通常你会使用一个你将使用T* const
指针的引用,除非你需要允许NULL
指针。
TA贡献1866条经验 获得超5个赞
我想这里已经回答了所有问题,但我只想补充一点,你应该小心typedef
s!它们不仅仅是文本替换。
例如:
typedef char *ASTRING;const ASTRING astring;
类型astring
是char * const
,而不是const char *
。这是我总是倾向于放在const
类型右侧的一个原因,而不是从一开始。
TA贡献1802条经验 获得超5个赞
几乎所有人都指出:
有什么区别const X* p
,X* const p
和const X* const p
?
你必须从右到左阅读指针声明。
const X* p
表示“p指向一个常数为X的X”:不能通过p更改X对象。
X* const p
表示“p是指向非const的X的const指针”:您不能更改指针p本身,但可以通过p更改X对象。
const X* const p
表示“p是指向X的常量指针”:您不能更改指针p本身,也不能通过p更改X对象。
TA贡献1871条经验 获得超8个赞
常量参考:
对变量(此处为int)的引用,它是常量。我们主要将变量作为引用传递,因为引用的大小小于实际值,但是存在副作用,这是因为它就像实际变量的别名。我们可能会通过完全访问别名来意外更改主变量,因此我们将其设置为常量以防止此副作用。
int var0 = 0;const int &ptr1 = var0;ptr1 = 8; // Errorvar0 = 6; // OK
常量指针
一旦常量指针指向变量,它就不能指向任何其他变量。
int var1 = 1;int var2 = 0;int *const ptr2 = &var1;ptr2 = &var2; // Error
指向常数的指针
一个指针,通过它可以不改变它指向的变量的值,这个指针称为指向常量的指针。
int const * ptr3 = &var2;*ptr3 = 4; // Error
指向常量的常量指针
指向常量的常量指针是一个指针,既不能改变它指向的地址,也不能改变保存在该地址的值。
int var3 = 0;int var4 = 0;const int * const ptr4 = &var3;*ptr4 = 1; // Error ptr4 = &var4; // Error
- 4 回答
- 0 关注
- 1488 浏览
添加回答
举报