我总是搞砸如何正确使用const int*、const int*const和int const*。有没有一套规则来定义你能做什么和不能做什么?
我想知道在赋值、传递给函数等方面的所有注意事项。
我总是搞砸如何正确使用const int*、const int*const和int const*。有没有一套规则来定义你能做什么和不能做什么?
我想知道在赋值、传递给函数等方面的所有注意事项。
当前回答
很多人都答对了,我会在这里整理好,并在给出的答案中添加一些缺失的额外信息。
Const是C语言中的关键字,也称为限定符。Const罐应用于任何变量的声明,以指定其值不会改变
const int a=3,b;
a=4; // give error
b=5; // give error as b is also const int
you have to intialize while declaring itself as no way to assign
it afterwards.
如何阅读?
只需从右到左阅读每一条语句即可顺利完成
3件主要事情
type a. p is ptr to const int
type b. p is const ptr to int
type c. p is const ptr to const int
[错误]
if * comes before int
两种类型
1. const int *
2. const const int *
我们先看
主要类型1。常量int*
在3个地方安排3件事的方法3=6.
i.*开始时
*const int p [Error]
*int const p [Error]
二。开始时常量
const int *p type a. p is ptr to const int
const *int p [Error]
iii.开始时int
int const *p type a.
int * const p type b. p is const ptr to int
主要类型2。常量常量int*
在4个地方安排4件事情的方法,其中2件是相同的4件/2!=12
i.*开始时
* int const const p [Error]
* const int const p [Error]
* const const int p [Error]
二。开始时为int
int const const *p type a. p is ptr to const int
int const * const p type c. p is const ptr to const int
int * const const p type b. p is const ptr to int
iii.启动时的常量
const const int *p type a.
const const * int p [Error]
const int const *p type a.
const int * const p type c.
const * int const p [Error]
const * const int p [Error]
挤成一体
类型a.p是常量int(5)的指针
const int *p
int const *p
int const const *p
const const int *p
const int const *p
类型b.p是int(2)的常量指针
int * const p
int * const const p;
类型c.p是const ptr到const int(2)
int const * const p
const int * const p
只是很少的计算
1. const int * p total arrangemets (6) [Errors] (3)
2. const const int * p total arrangemets (12) [Errors] (6)
小小的额外
int常量*p,p2;
here p is ptr to const int (type a.)
but p2 is just const int please note that it is not ptr
int*常量p,p2;
similarly
here p is const ptr to int (type b.)
but p2 is just int not even cost int
int常量*常量p,p2;
here p is const ptr to const int (type c.)
but p2 is just const int.
完成了
其他回答
一般规则是const关键字应用于它前面的内容。异常,起始常量适用于以下内容。
constint*与intconst*相同,表示“指向常量int的指针”。const int*const与int const*const相同,表示“指向常量int的常量指针”。
编辑:对于该做的和不该做的,如果这个答案还不够,你能更准确地说出你想要什么吗?
最初的设计者多次将C和C++声明语法描述为失败的实验。
相反,让我们将类型命名为“pointer to type”;我叫它Ptr_:
template< class Type >
using Ptr_ = Type*;
现在Ptr_<char>是一个指向char的指针。
Ptr_<const char>是指向const char的指针。
const Ptr_<const char>是指向const char的const指针。
C++中围绕常量正确性还有许多其他微妙之处。我想这里的问题只是关于C,但我会给出一些相关的例子,因为标记是C++:
通常将字符串等大参数作为TYPE const&传递,这会防止对象被修改或复制。例子:TYPE&TYPE::operator=(const TYPE&rhs){…return*this;}但是TYPE&const是没有意义的,因为引用总是常量。您应该始终将不修改类的类方法标记为const,否则不能从TYPE const引用调用该方法。例子:bool TYPE::运算符==(const TYPE&rhs)const{…}在一些常见情况下,返回值和方法都应该是常量。例子:const TYPE TYPE::运算符+(const TYPE&rhs)const{…}事实上,const方法不能返回内部类数据作为对非常量的引用。因此,必须经常使用常量重载创建常量和非常量方法。例如,如果定义T const&operator[](unsigned i)const;,那么您可能还需要以下给出的非常量版本:内联T运算符[](无符号i)(&O){返回const_cast<char&>(static_cast<const TYPE&>(*this)[](i));}
事实上,C中没有常量函数,非成员函数本身在C++中不能是常量,常量方法可能有副作用,编译器不能使用常量函数来避免重复的函数调用。事实上,即使是一个简单的int const&reference,它引用的值也可能在其他地方更改。
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风格的声明,而人们可能会讨厌/拒绝这种声明)