1. 程式人生 > >C++Primer第五版 第二章習題答案(11~20)

C++Primer第五版 第二章習題答案(11~20)

2.11

涉及知識點:

宣告:使得名字為程式所知,如果想使用該變數,則必須實現包含其宣告。宣告會確定變數的名字和型別。

定義:創建於名字關聯的實體。定義會申請儲存空間,可能會賦予初始值。

如果想宣告一個變數而不想定義它,那麼可以在變數名前加extern關鍵字。

所以1、定義   2、定義  3、宣告

2.12

字母+數字+下劃線(必須以字母或者下劃線開頭)

C++中關於變數命名的規範:

1:能體現變數的實際意義

2:變數名一般採用小寫字母

3:使用者自定義變數名可以以大寫字母開頭

4:多個單詞定義的變數名應有區分Student_loan   而不是  Studentloan

a:錯誤:使用關鍵字double作為變數名

b:正確

c:錯誤:無效字元“—”

d:錯誤:不能以數字開頭

e:正確(但是不好)

2.13

新建區域性變數會覆蓋同名的全域性變數

j=100

2.14

合法,與上題類似

不同的是:顯示訪問i變數會訪問到全域性變數上  std::cout<<

i = 100   sum = 45

所以程式中不要出現同名變數

2.15

所謂引用:它只是為存在的物件所起的另外一個名字。它不是一個物件,沒有實際的地址。

int value = 10;
	int &My_value = value;   //引用,在定義引用的時候會將引用和它的初始值繫結在一起,而不是簡單的賦值
	int My_value = 5;        //將5賦給了My_value和value
	int Her_value = My_value; //相當於將value賦給了Her_value
	int &My_value = 10;       //錯誤:引用型別的初始值必須是一個物件
	double vvalue = 40.6; 
	int &My_value = vvalue;   //錯誤:引用型別的初始值必須是int型物件
示例:

編譯器會報錯。

所以這一題:

a:合法,但是會強制型別轉換

b:錯誤

c:正確

d:不合法,引用定義時必須初始化

2.16

a:合法  d的值變為3014159

b:合法  強制型別轉換

c:合法  強制型別轉換

d:合法  強制型別轉換

2.17

10      10

前面說得很清楚了吧~~

2.18

 先簡單的瞭解一下指標:它和引用類似也實現了與其他物件之間的間接訪問.

定義指標型別的變數通常是:int *P     P是變數名,加*號指的是其是一個int型別的指標。

指標型別也需要和匹配物件型別嚴格吻合

int a;
int *p1=&a;   //初始值為a的地址
int *p2=p1;   //初始值為int型別物件的指標,也就是指標的指標

關鍵點(非常重要):

int i =10;
int &j = i;  //&符號緊隨型別名出現,它是宣告的一部分,j是一個引用。
int *p;     //*符號緊隨型別名出現,它是宣告的一部分,p是一個指標。
p = &i;    //&符號出現在表示式之中,是一個取地址符號。
*p = i;    //*符號出現在表示式之中,是一個解引用符
int &j2 = *p;   //&是宣告的一部分,*是解引用符。

一定要注意到這兩個符號的多重含義!!!

一定要注意到這兩個符號的多重含義!!!

一定要注意到這兩個符號的多重含義!!!

所以這一題的程式碼如下:

#include<iostream>
using namespace std;
int main()
{
    int a = 0, b = 1;
    int *p1 = &a, *p2 = p1;
    p1 = &b;  //改變了指標的值
    *p1 = b;   //改變指標所指物件的值
}
2.19

主要區別上面講的很清楚,這裡總結一下:

1:指標本身就是一個物件,允許指標之間的拷貝和賦值,也可以在其生命週期指向不同的物件。而引用不行

2:指標無需在定義時賦值。

2.20

這段程式碼首先定義了一個int型的變數i,並賦初值42,隨後定義了一個int型指標,初始值為i的地址,*P在表示式中,指的就是解操作符,而中間的*是乘的意思,所以作用就是將i改變為42*42。

要注意的就是*這個符號的多重含義