sizeof 運算子指出整個陣列的長度;
strlen
()函式返回的是儲存在陣列中的字串的長度,而不是陣列本身的長度。另,strlen()只計算可見的字元,而不把空字元計算在內。
cin使用空白(空格、製表符和換行符)來確定字串的結束位置。即cin在獲取字串陣列輸入時只讀取乙個單詞。
讀取一行字串的方法 p78
:① getline(): cin.getline(name,20); getline()函式每次讀取一行,通過換行符來確定行尾,但不儲存換行符。相反,在儲存字串時,用空字元來替代換行符。
② get(): 並不再讀取並丟棄換行符,而是將其留在輸入佇列中。
cin.get(name, namesize).get();
cin.get(dessert, size);
注:如果使用的是cin.get(name,size),則編譯器知道是要將乙個字串放入陣列中,因而將使用適當的成員函式。如果使用的是cin.get(),則編譯器知道是要讀取乙個字元。
④ 當讀取空行時:
get()讀取空行後將設定失效位(failbit)。這意味著接下來的輸入將被中斷,但可用下面的命令來恢復輸入:cin.clear();
⑤ 若輸入字串比分配的空間長:則getline()和get()將把餘下的字元留在輸入佇列中,而getline()還會設定失效位。
⑥ 若混合輸入字串和數字,為防止輸入數字後的換行符被賦給字串,應當:
cin>>year; cin.get(); cin.getline(address,80);
或: (cin>>year).get(); //(or (cin>>year).get(ch);)
共用體union p94:
能夠儲存不同的資料型別,但只能同時儲存其中的一種型別。
常用於(但並非只能用於)節省記憶體。另外,共用體常用於作業系統資料結構或硬體資料結構。
使用new來分配記憶體 p102:
typename * pointer_name = new typename;
使用delete釋放記憶體
① delete將釋放指標指向的記憶體,但不會刪除指標本身。
② 一定要配對的使用new和delete,否則將發生記憶體洩漏(memory leak)
③ 不能使用delete來釋放宣告變數所獲得的記憶體。
④ 只能用delete來釋放使用new分配的記憶體。然而,對空指標使用delete是安全的。
使用new來建立動態陣列 p104
① 如果程式只需要乙個值,則可能會宣告乙個簡單變數。通常,對於大型資料(如陣列、字串和結構),應使用new。例如,假設要編寫乙個程式,它是否需要陣列取決於執行時使用者提供的訊息。如果通過宣告來建立陣列,則在程式被編譯時將為它分配記憶體空間。不管程式最終是否使用陣列,陣列都在那裡,它占用了記憶體。在編譯時給陣列分配記憶體被稱為靜態聯編(static binding),意味著陣列是在編譯時加入到程式中的。但使用new時,如果在執行階段需要陣列,則建立它;如果不需要,則不建立。還可以在程式執行時選擇陣列的長度。這被稱為動態聯編(dynamic binding),意味著陣列是在程式執行時建立的。這種陣列叫做動態陣列。使用靜態聯編時,必須在編寫程式時指定陣列的長度;使用動態聯編時,程式將在執行時確定陣列的長度。
② 使用new來建立動態陣列。
a) 使用new建立的陣列,應使用delete psome; 來釋放
b) 使用new和delete時,應遵循以下規則:
i. 不要使用delete釋放不是new分配的記憶體
ii. 不要使用delete釋放同一記憶體塊兩次
iii. 如果使用new為陣列分配記憶體,則應使用delete來釋放
iv. 如果使用new為乙個實體分配記憶體,則應使用delete(沒有方括號)來釋放
v. 對空指標應用delete是安全的
c) 為陣列分配記憶體的通用格式:
type_name *pointer_name = new type_name[num_elements];
③ 使用動態陣列
a) c和c++內部都使用指標來處理陣列。陣列和指標基本等價。
b) 不能修改陣列名的值,但指標是變數,因此可以修改它的值。
c) 將指標變數加1後,其增加的值等於指向的型別占用的位元組數。
d) 對陣列應用sizeof運算子得到的是陣列的長度,而對指標應用sizeof得到的是指標的長度,即使指標指向的是乙個陣列。
p108
指標和陣列:
① 將指標變數加1後,其增加的值等於指向的型別占用的位元組數。
② 在很多情況下,可以相同的方式使用指標名和陣列名。對於它們,可以使用陣列方括號表示法,也可以使用解除引用運算子(*),它們都表示位址。區別之一是,可以修改指標的值,而陣列名是常量。
③ 對陣列應用sizeof運算子得到的是陣列的長度,而對指標應用sizeof得到的是指標的長度,即使指標指向的是乙個陣列。這種情況下,c++不會將陣列名解釋為位址。
④ short tell[10];
cout《陣列的替代品:
vector
和array
模板類vector:
模板類vector類似於string類,也是一種動態陣列。可在執行階段設定vector物件的長度,可在末尾附加新資料,還可在中間插入新資料。基本上,它是使用new建立動態陣列的替代品。實際上,vector類確實使用new和delete來管理記憶體,但這種工作是自動完成的。
① 要使用vector物件,必須包含標頭檔案vector。
② vector包含在命名空間std中。
③ 模板使用不同的語法來指出它儲存的資料型別。
④ vector類使用不同的語法來指定元素數。
⑤ 一般而言,下面的宣告建立乙個名為vt的vector物件,它可以儲存n_elem個型別為typename的元素:
vectorvt(n_elem);
其中n_elem可以是整型常量,也可以是整型變數。
⑥ #include
模板類array(c++11)
① c++新增了模板類array,它也位於命名空間std中。與陣列一樣,array物件的長度也是固定的,也使用棧(靜態記憶體分配),而不是自由儲存區,因此其效率與陣列相同,但更方便,更安全。
② 要建立array物件,需包含標頭檔案array:
#include
③ arrayarr;
④ n_elem不能是變數
⑤ 在c++11中,可將列表初始化用於vector和array物件,但在c++98中,不能這樣做。
C Primer Plus 第四章 復合型別
這兩天忙的厲害,閱讀計畫有點沒有按時完成哦,週末感冒,作業擠的荒,o o.哈哈堅持!現在回過來看,說明 c primer plus前面的至少六章都和c關聯很大。覺得很多東西一下子清晰了不少,而且在近期的幾次作業中也能得到應用,感覺真不錯。可見反覆的力量!還有一點就是一定要把課後的習題一步步做完,提高...
c primer plus第四章習題答案
這章的內容不錯,字串結構體共用體列舉指標陣列,程式設計的最基本型別基本都有涉及 字串操作比較易錯且知識易忘,各位要注意了 結構體共用體會與以後的記憶體對齊有關,這個就是定址和儲存上的事了 指標就是位址,老師多次強調,各位不妨一記 給 第一題 include include using namespa...
C Primer Plus 隨記2(第四章)
1.宣告陣列 short months 12 訪問其元素 month 0 month 11 2.初始化陣列 1 int yam 3 列表初始化可省略等號,也可 不包含資料,元素均初始化為0 2 int xam 3 xam 0 20 xam 1 3 xam 2 5 xam 3 錯,不允許 xam ya...