练习2.27、2.28、2.29

2.27:下面哪些初始化是合法的?请说明原因。

(a)int i=-1,&r=0;  (b)int *const p2=&i2;

(c)const int i=-1,&r=0; (d)const int *const p3=&i2;

(e)const int *p1=&i2;    (f)const int &const r2;

(g)const int i2=i,&r=i;

a)非法的。int类型变量i的取值范围是-32768~32767,所以使用-1初始化它合法,r是一个非常量引用,不能引用字面值

b)合法。p2是一个指针常量,指针本身是常量,但是其所指的对象可以不是常量,故合法。

c)合法。变量i是一个int类型常量,r是一个常量引用,可以引用字面值。

d)合法。p3是一个指向常量的对象的指针常量,指针p3本身的值不可以改变,也不可以使用指针去修改指向对象的值。

e)合法。p1是一个常量指针,其指向常量对象,不可以通过指针去修改指向的对象。

f)不合法。引用本身不是对象,不能让引用保持不变。

g)合法。定义一个常量变量i2,并使用变量i的值对它进行初始化,r是常量引用,常量引用可以引用任意类型的对象,表达式,字面值。

2.28:说明下面的这些定义是什么意思,挑出其中不合法的。

(a)int i,*const cp;  (b)int *p1,*const p2;

(c)const int ic,&r=ic;    (d)const int *const p3;

(e)const int *p;

a)定义一个int类型的变量和一个指针常量cp。其中,指针常量cp不合法,指针常量定义时需要初始化。

b)定义一个指针p1和一个指针常量p2。其中,指针常量p2不合法,指针常量定义时需要初始化。

c)定义一个int类型的常量ic和一个常量引用r。其中常量ic需要进行初始化。

d)定义一个指向常量的指针常量p3;不合法,指针常量定义时需要初始化。

e)int类型的常量指针p。合法。但是常量指针p没有指向任何对象。

2.29:假设已有上一个练习中定义的那些变量,则下面的哪些语句是合法的?请说明原因。

(a)i=ic;  (b)p1=p3;

(c)p1=⁣  (d)p3=⁣

(e)p2=p1;  (f)ic=*p3;

a)合法。ic是一个int类型的常量,用于初始化int类型的变量i,是值的拷贝,并没有修改ic的值,故合法。

b)合法。p1是一个int类型的指针,用p3这个指向常量的指针常量去初始化它,也不会修改p3的值,但是p1是普通指针,因此语法上可以通过p1间接修改p3的值,显然是不合理的,因此非法

c)不合法。ic是int类型的常量,只能使用常量指针才能去保存常量对象的地址,而指针p不是常量指针。

d)合法。p3是指向常量的指针常量,因此它不能被修改,故不合法。

e)不合法。指针p1不可以用来初始化指针常量p2,因为这样会修改了指针常量p2,故不合法。

f)不合法。ic是常量不可被修改。

原文地址:https://www.cnblogs.com/Dark-King/p/9362825.html