我总是搞砸如何正确使用const int*、const int*const和int const*。有没有一套规则来定义你能做什么和不能做什么?

我想知道在赋值、传递给函数等方面的所有注意事项。


当前回答

在我读到C++大师斯科特·梅耶斯(Scott Meyers)的这本书之前,我和你一样心存疑虑。请参阅本书中的第三项,其中他详细介绍了如何使用const。

只需遵循以下建议

如果单词const出现在星号的左侧,则所指向的是常量如果单词const出现在星号的右侧,则指针本身是常量如果常量出现在两侧,则两者都是常量

其他回答

常量的简单使用。

最简单的用法是声明一个命名常量。为此,我们声明一个常量,就像它是一个变量一样,但在它之前添加const。我们必须立即在构造函数中初始化它,因为当然,以后不能设置值,因为这会改变它。例如:

const int Constant1=96; 

将创建一个值为96的整数常量,无想象力地称为常量1。

这些常数对于程序中使用但在程序编译后不需要更改的参数是有用的。与C预处理器#define命令相比,它对程序员有一个优势,即编译器本身可以理解和使用它,而不仅仅是在到达主编译器之前由预处理器替换到程序文本中,因此错误消息更有用。

它也适用于指针,但必须注意const的位置,以确定指针或指针指向的对象是常量还是两者都是常量。例如:

const int * Constant2 

声明Constant2是指向常量整数的变量指针,并且:

int const * Constant2

是一种替代语法,其作用相同,而

int * const Constant3

声明Constant3是指向变量整数的常量指针

int const * const Constant4

声明Constant4是指向常量整数的常量指针。基本上,“const”适用于其紧邻左侧的任何内容(除非那里什么都没有,在这种情况下,它适用于紧邻右侧的任何内容)。

裁判:http://duramecho.com/ComputerInformation/WhyHowCppConst.html

常量参考:对变量(此处为int)的引用,该变量是常量。我们主要将变量作为引用传递,因为引用的大小比实际值小,但有一个副作用,这是因为它像实际变量的别名。通过对别名的完全访问,我们可能会意外地更改主变量,因此我们将其设置为常量以防止这种副作用。int var0=0;常量int&ptr1=var0;ptr1=8;//错误var0=6;//好啊常量指针一旦常量指针指向一个变量,那么它就不能指向任何其他变量。int var1=1;int var2=0;int*const ptr2=&var1;ptr2=&var2;//错误指向常量的指针不能改变所指向变量值的指针称为常量指针。int const*ptr3=&var2;*ptr3=4;//错误指向常量的常量指针指向常量的常量指针是一个既不能改变它所指向的地址,也不能改变保存在该地址的值的指针。int var3=0;int var4=0;const int*const ptr4=&var3;*ptr4=1;//错误ptr4=&var4;//错误

const int*-指向常量int对象的指针。

您可以更改指针的值;不能更改指针指向的int对象的值。


const int*const-指向常量int对象的常量指针。

不能更改指针的值,也不能更改指针指向的int对象的值。


int const*-指向常量int对象的指针。

此语句相当于1。constint*-可以更改指针的值,但不能更改指针指向的int对象的值。


实际上,还有第四种选择:

int*const-指向int对象的常量指针。

可以更改指针指向的对象的值,但不能更改指针本身的值。指针将始终指向同一个int对象,但此int对象的值可以更改。


如果你想确定某种类型的C或C++结构,你可以使用David Anderson制定的顺时针/螺旋规则;但不要与罗斯·J·安德森(Ross J.Anderson)制定的安德森规则混淆,这是一个非常独特的规则。

简单助记符:

类型指针<-*->指针对象名称


我喜欢把int*I看作是声明“I的解引用是int”;在这个意义上,constint*i表示“i的deref是constint”,而int*consti表示“consti的derref是int”。

(像这样思考的一个危险是,它可能会导致人们倾向于int const*i风格的声明,而人们可能会讨厌/拒绝这种声明)

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

下面是一个演示: