C Primer Plus 第四章筆記

2021-07-04 20:36:43 字數 3324 閱讀 2938

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...