練習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是常量不可被修改。
練習2.27、2.28、2.29