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。
要注意的就是*這個符號的多重含義