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

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


当前回答

简单助记符:

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


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

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

其他回答

这很简单,但很棘手。请注意,我们可以将const限定符应用于任何数据类型(int、char、float等)。

让我们看看下面的例子。


const int*p==>*p是只读的[p是指向常量整数的指针]

int const*p==>*p是只读的[p是指向常量整数的指针]


int*p const==>错误语句。编译器抛出语法错误。

int*const p==>p是只读的[p是指向整数的常量指针]。因为这里的指针p是只读的,所以声明和定义应该在同一位置。


const int*p const==>错误语句。编译器抛出语法错误。

const int const*p==>*p为只读

const int*const p==>*p和p是只读的[p是指向常量整数的常量指针]。因为这里的指针p是只读的,所以声明和定义应该在同一位置。


int const*p const==>错误语句。编译器抛出语法错误。

int const int*p==>错误语句。编译器抛出语法错误。

int const const*p==>*p是只读的,与int const*p等效

int const*const p==>*p和p是只读的[p是指向常量整数的常量指针]。因为这里的指针p是只读的,所以声明和定义应该在同一位置。

对我来说,常量的位置,即它相对于*是出现在左侧还是右侧,还是同时出现在左侧和右侧,有助于我理解实际含义。

*左边的常量表示指针指向的对象是常量对象。*右边的常量表示指针是常量指针。

下表摘自斯坦福CS106L标准C++编程实验室课程阅读器。

很多人都答对了,我会在这里整理好,并在给出的答案中添加一些缺失的额外信息。

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. 

完成了

就像每个人都指出的那样:

常量X*p、X*constp和常量X*const p之间有什么区别?

必须读取指针声明从右到左。const X*p表示“p指向常量的X”:X对象不能通过p更改。X*const p表示“p是指向非常量X的常量指针”:不能更改指针p本身,但可以通过p更改X对象。const X*const p表示“p是指向常量X的常量指针”:不能更改指针p本身,也不能通过p更改X对象。

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

下面是一个演示: