C++ Primer Plus 学习笔记(第 4 章 复合类型)
C++ Primer Plus 學習筆記
第 4 章 復合類型
數組
數組(array)是一種數據格式,能夠存儲多個同類型的值。
要創建數組,可使用聲明語句。數組聲明應指出以下三點:
- 存儲在每個元素的值的類型;
- 數組名;
- 數組中的元素數。
聲明數組的通用格式如下:
typename arrayName[arraySize];表達式arraySize指定元素數目,必須是整數或const值,也可以是常量表達式,即其中所有的值在編譯時都是已知的,即不能是變量。
使用下標或索引訪問元素,C++數組從0開始編號。編譯器不會檢查使用的下標是否有效。
數組的初始規則
只有在定義數組時才能使用初始化,此后就不能使用了,也不能將一個數組賦給另一個數組。
然而,可以使用下標分別給數組中的元素賦值。
初始化數組時,提供的值可以少于數組的元素數目。
如果只對數組的一部分進行初始化,則編譯器將把其他元素設置為0。
如果初始化數組時方括號內為空,C++編譯器將計算元素個數。此方法對將字條數組初始化為一個字符串來說比較安全。
C++11 數組初始化方法
C++11將使用大括號的初始化(列表初始化)作為一種通用的初始化格式,可用于所有類型。
數組以前就可以使用列表初始化,但C++11中的列表初始化新增了一些功能。
首先,初始化數組時,可以省略等號(=)。
其次,可不在大括號內包含任何東西,這將把所有元素都設置為零。
第三,列表初始化禁止縮窄轉換。
字符串
字符串是存儲在內存的連續字節中的一系列字符。C++處理字符串的方式有兩種。第一種來自C語言,常被稱作C-風格字符串(C-style string)。另一種是基于string類庫的方法。
C-風格字符串具有一種特殊的性質:空字符(null character)結尾,空字符實寫作\0,其ASCII碼為0,用來標記字符串的結尾。
將字符數組初始化為字符串的方法——只需使用一個引號括起的字符串即可,這種字符串被稱為字符串常量(string constant)或字符串字面值(string literal)。
用引號括起的字符串常量隱式地包括結尾的空字符,因此不用顯示地包括它。
注意:字符串常量(使用雙引號)不能與字符常量(使用單引號)互換。
拼接字符串常量
C++允許拼接字符串字面值,任何兩個由空白(空格、制表符和換行符)分隔的字符串常量都將自動拼接成一個。
注意:拼接時不會在被連接的字符串之間添加空格,第一個字符串中的\0字符將被第二個字符串的第一個字符取代。
在數組中使用字符串
要將字符串存儲到數組中,最常用的方法有兩種——將數組初始化為字符串、將鍵盤或文件輸入讀入到數組中。
字符串輸入
cin使用空白(空格、制表符和換行符)來確定字符串的結束位置。
每次讀取一行字符串輸入
iostream中的類(如cin)提供了一些面向行的類成員函數:getline()和get()。這兩個函數都讀取一行輸入,直到到達換行符。然而,隨后getline()將丟棄換行符,而get()將換行符保留在序列中。
面向行的輸入getline()
cin.getline(charArray, strSize);getline()函數每次讀取一行,最多讀取strSize-1個字符,通過換行符確定行尾,但不保存換行符,存儲時用空字符代替換行符。
面向行的輸入get()
get()第一種工作方式與getline()類似,接受相同的參數,但不再丟棄換行符,而是將它保留在輸入序列中。不帶參數即可讀取一個字符,包括換行符。
cin.get(charArray, strSize); cin.get();另一種使用get()的方式是將兩個類成員函數拼接起來(合并),getline()也可以,其效果與兩次調用相同。
cin.get(charArray, strSize).get(); cin.getline(charArray1, strSize).getline(charArray2, strSize);空行和其他問題
當get()讀取空行后新塘鎮設置失效位,接下來的輸入被阻斷,可使用cin.clear();恢復輸入。
如果輸入行包含的字符數比指定的多,則getline()和get()將把余下的字符保留在輸入隊列中,而get()還會設置失效位,并關閉后面的輸入。
混合輸入字符串和數字
在cin讀取數字后,在getline()之前要丟棄換行符,可使用沒有參數的get()。
string 類簡介
C++98標準通過添加string類擴展了C++庫,可以使用string類型的對象來存儲字符串。string類使用起來比數組簡單,同時提供了將字符串作為一種數據類型的表示方法。
要使用string類,必須在程序中包含頭文件string。string類位于名稱空間std中,因此必須提供一條using編譯指令,或使用std::string來引用它。string類定義隱藏了字符串的數組性質,可像普通變量那樣處理字符串。
在很多方面,使用string對象的方式與使用字符數組相同。
- 可以使用C-風格字符串來初始化string對象。
- 可以使用cin來將鍵盤輸入存儲到string對象中。
- 可以使用cout來顯示string對象。
- 可以使用數組表示法來訪問存儲在string對象中的元素。
string對象與字符數組之間的主要區別是,可以將string對象聲明為簡單變量,而不是數組。
類設計讓程序能夠自動處理string的大小。這使用與使用數組相比,使用string對象更方便,也更安全。
未被初始化的string對象的長度被自動設置為0。
C++11 字符串初始化
C++11也允許將列表初始化用于C-風格字符串和string對象。
賦值、拼接和附加
不能將一個數組賦給另一個數組,但可以將一個string對象賦給另一個string對象。
可以使用運算符+將兩個string對象合并起來,還可以使用運算符+=將字符串附加到string對象的末尾。
可以將C-風格字符串或string對象與string對象相加,或將它們附加到string對象的末尾。
strlen()是一個常規函數,size()是一個類方法。
string 類 I/O
可以使用cin和運算符>>來將輸入存儲到string對象中,也可以使用cout和運算符<<來顯示string對象,其句法與C-風格字符串相同。但每次讀取一行而不是一個單詞時,使用的句法不同。
cin.getline(charry, 20); \\類方法 getline(cin, str); \\不是類方法在引入string類之前,C++就有了iostream類,所以iostream沒有處理string對象的類方法。
其他形式的字符串字面值
創建wchar_t、char16_t和char32_t的字符串常量時,C++分別使用前綴L、u和U表示。
C++11還支持Unicode字符編碼方案UTF-8,使用前綴u8來表示。
C++新增的另一種類型是原始(raw)字符串,在原始字符串中,字符表示的就是自己。
原始字符串將"(和)"用作界定符,并使用前綴R來標識原始字符串。可以在默認界定符之間添加任意數量的基本字符,但空格、左括號、右括號、斜杠和控制字符(如制表符和換行符)除外。
可將前綴R與其他字符串前綴結合使用,以標識wchar_t等類型的原始字符串。可將R放在前面,也可以放在后面,如Ru、UR等。
結構簡介
結構是用戶定義的類型,創建結構包括兩步。首先,結構聲明——定義這種類型的數據屬性;然后,按描述創建結構變量(結構數據對象)。
struct type_name {member_type1 member_name1;member_type2 member_name2;member_type3 member_name3;...... }; type_name object_names; object_names.nember_name1;C++允許在聲明結構變量時省略關鍵字struct,可以使用成員運算符.來訪問成員。訪問類成員函數的方式是從訪問結構成員變量的方式衍生而來的。
在程序中使用結構
結構聲明的位置很重要。外部聲明可以被其后面的任何函數使用,而內部聲明只能被該聲明所屬的函數使用。通常應使用外部聲明,這樣所有的函數都可以使用這種類型的結構。
變量也可以在函數內部和外部同義,外部變量由所有的函數共享。C++不提倡使用外部變量,但提倡使用外部結構聲明。另外,在外部聲明符號常量通常更合理。
C++11 結構初始化
首先,C++11也支持將列表初始化用于結構,且等號=是可選的。
其次,如果大括號內未包括任何東西,各個成員都將被設置為零。
最后,不允許縮窄轉換。
結構可以將 string 類作為成員
一定要讓結構定義能夠訪問名稱空間std,為此,可以將using編譯指令移到結構定義之前,也可以使用類型聲明std::string。
其他結構屬性
C++使用戶定義的類型與內置類型盡可能相似。例如,可以將結構作為參數傳遞給函數,也可以讓函數返回一個結構。另外,還可以使用賦值運算符=將結構賦給另一個同類型的結構,即使成員是數組,這種賦值被稱為成員賦值。
可以同時完成定義結構和創建結構變量的工作,只需將變量名放在結束括號后面即可,甚至可以初始化以這種方式創建的變量。
然而,將結構定義與變量聲明分開,可以使用程序更易于閱讀和理解。
還可以聲明沒有名稱的結構類型,方法是省略名稱,同時定義一種結構類型和這一個這種類型的變量。但這種類型沒有名稱,因此以后無法再創建這種類型的變量。
結構數組
可以創建元素是結構的數組,方法和創建基本類型數組完全相同。其中每個元素可以與成員運算符一起使用。
要初始化結構數組,可以結合使用初始化數組的規則(用逗號分隔每個元素,并將這些值用花括號括起來)和初始化結構的規則(用逗號分隔每個成員的值,并將這些值用花括號括起來)。
結構中的位字段
與C語言一樣,C++也允許指定占用特定位數的結構成員,這使得創建與某個硬件設備上的寄存器對應的數據結構非常方便。字段的類型就為整數或枚舉,接下來是冒號,冒號后面是一個數字,指定使用的位數。也可以使用沒有名稱的字段來提供間距。每個成員都被稱為位字段(bit field)。
struct torgle_register {unsigned int SN : 4;unsigned int : 4;bool goodIn : 1;bool goodTorgle : 1; }; torgle_register tr = { 14, true, false }; if (tr.goodIn)位字段通常用在低級編程中。一般來說,可以使用整型和按位運算符來代替這種方式。
共用體
共用體(union)是一種數據結構,它能夠存儲不同的數據類型,但只能同時存儲其中的一種類型。
union one4all {int int_val;long long_val;double double_val; };可以使用one4all變量來存儲int、long或double,條件是在不同的時間進行。
由于共用體每次只能存儲一個值,因此它必須有足夠的空間來存儲最大的成員,所以,共用體的長度為最大成員長度。
共用體的用途之一是,當數據項使用兩種或更多種格式(但不會同時使用)時,可節省空間。例如,假設管理一個小商品目錄,其中有一些商品ID為整數,而另一些的ID為字符串。在這種情況下,可以這樣做。
struct widget {char brand[20];int type;union id{long id_num;char id_char[20];}id_val; }; ... widget prize; ... if(prize.type == 1)cin >> prize.id_val.id_num; elsecin >> prize.id_val.id_char;匿名共用體沒有名稱,其成員將成為位于相同地址的變量。顯然,每次只有一個成員是當前的成員:
struct widget {char brand[20];int type;union{long id_num;char id_char[20];}; }; ...widget prize; ...if(prize.type == 1)cin>>prize.id_num; elsecin>>prize.id_char;由于共用體是匿名的,因此id_num和id_char被視為prize的兩個成員,它們的地址相同,所以不需要中間標識符id_val。程序員負責確定當前哪個成員是活動的。
共用體常用于(但并非只用于)節省內存。C++還常用于嵌入式系統編程,如控制烤箱、MP3播放器或火星漫步者的處理器。對這些應用程序來說,內存可能非常寶貴。另外,共用體還常用于操作系統數據結構或硬件數據結構。
枚舉
C++的enum工具提供了另一種創建符號常量的方式,可以代替const。它還允許定義新類型,但必須按嚴格的限制進行。使用enum的句法與使用結構相似。
enum color_set1 {RED, ORANGE, YELLOW, GREEN, BLUE, WHITE, BLACK};將RED、ORANGE、 YELLOW等作為符號常量,叫做枚舉量。
在默認情況下,將整數賦給枚舉量,從0開始。也可通過顯式地指定整數值來覆蓋默認值。
可能用枚舉名來聲明這種類型的變量。
在不進行強制類型轉換的情況下,只能將定義枚舉時使用的枚舉量賦給這種枚舉變量。
對于枚舉,只定義了賦值運算符,沒有為枚舉定義算術運算。可以在算術表達式中同時使用枚舉和常規整數,枚舉將轉換為整數。
如果整數值是有效的,則可通過強制類型轉換,將它賦給枚舉變量。
實際上,枚舉更常被用來定義相關的符號常量,而不是新類型。如果打算只使用常量,而不創建枚舉變量,則可以省略枚舉類型的名稱。
設置枚舉量的值
可以使用賦值運算符來顯式地設置枚舉量的值,指定的值必須是整數。也可以只顯式地定義其中一些枚舉量的值,沒有被顯式定義的枚舉量的值將比其前面的枚舉量大1。
可以創建多個值相同的枚舉量。
枚舉的聚會范圍
最初,對于枚舉來說,只有聲明中指出的那些值是有效的。然而,C++現在通過強制類型轉換,增加了可賦值給枚舉變量的合法值。每個枚舉都有取值范圍(range),通過強制類型轉換,可以將取值范圍中的任何整數值賦給枚舉變量,即使這個值不是枚舉值。
取值范圍的定義如下。
首先,要找出上限,需要知道枚舉量的最大值。大于這個最大值的、最小的2次冪減1,就是取值范圍的上限。
要計算下限,需要知道枚舉量的最小值。如果不小于0,則取值范圍的下限就是0;否則,采用與尋找上限相同的方法,但加上負號。
選擇多少空間來存儲枚舉由編譯器決定。
指針和自由存儲空間
指針是一個變量,其存儲的是值的地址,而不是值本身。
對變量應用地址運算符&,可以獲得它的地址。
使用常規變量時,值是指定的量,而地址為派生量。
使用指針變量時,將地址視為指定的量,而將值視為派生量。
指針名表示地址,*運算符被稱為間接值或解除引用運算符,將其用于指針,可以得到該地址外存儲的值。
聲明和初始化指針
指針聲明必須指定指針指向的數據的類型。
int * p1, * p2; int higgens = 5; int * pt = &higgens;*運算符兩邊的空格是可選的。對每個變量,都需要使用一個*。
可以在聲明語句中初始化指針。
指針的危險
在C++創建指針時,計算機將分配用來存儲地址的內存,但不會分配用來存儲指針所指向的數據的內存。
警告:一定要在對指針應用解除引用運算符*之前,將指針初始化為一個確定的、適當的地址。
指針與數字
指針不是整型,不能簡單地將整型同給指針,應通過強制類型將數字轉換為適當的地址類型。
int * pt = (int *)0xB0000000;使用 new 來分配地址
將指針初始為變量的地址,變量是在編譯時分配的有名字的地址,指針只是可以通過名稱直接訪問的地址提供了一個別名。
指針真正的用武之地在于,在運行階段分配未命名的內存以存儲值。在這種情況下,只能通過指針來訪問內存。
C++用new運算符來分配內存。
new運算符根據類型來確定需要多少字節的內存,然后,找到這樣的內存,并返回其地址。
我們說pt指向一個數據對象,它指的是為數據項分配的地址,因此,變量也是數據對象,但指向的內存不是變量。
在C++中,值為0的指針被稱為空指針(null pointer)。C++確保空指針不會指向有效的數據。C++提供了檢測并處理內存失敗的工具。
使用 delete 釋放內存
使用deltet運算符,能在使用完內存后,將其歸還給內存池,歸還或釋放(free)的內存可供程序的其他部分使用。
使用deltet時,后面要加上指向內存塊的指針(這些內存塊最初是用new分配的。
deltet釋放內存,但不會刪除指針。
一定要配對使用new和deltet,否則將發生內存泄露(memory leak),即被分配的內存再也無法使用。
不要嘗試釋放已經釋放的內存塊,C++標準指出,這樣做的結果將是不確定的。也不能用deltet來釋放聲明變量所獲得的內存。
只能用deltet來釋放使用new分配的內存,但對空指針使用deltet是安全的。
注意:使用deltet的關鍵在于,將它用于new分配的內存。這并不意味著要使用用于new的指針,而是用于new的地址。
使用 new 來創建動態數組
通過聲明創建數組,在編譯時給數組分配內存,稱為靜態聯編。使用new時,在需要的時候創建數組,還可選擇數組的長度,這稱為動態聯編。這種數組叫做動態數組。
使用 new 創建動態數組
創建動態數組,要將數組的元素類型和元素數目告訴new。必須在類型名后加上方括號,其中包含元素數目。
type_name * point_name = new type_name [num_elements]; delete [] point_name;new運算符返回第一個元素的地址。delete后的方括號表示釋放整個數組。不能使用sizeof運算符來確定動態分配的數組包含的字節數。
使用new和delete時,應遵循的規則:
- 不要使用delete來釋放不是new分配的內存。
- 不要使用delete釋放同一個內存塊兩次。
- 如果使用new []為數組分配內存,則應使用delete []來釋放。
- 如果使用new []為一個實體分配內存,則應使用delete(沒有方括號)來釋放。
- 對空指針應用delete是安全的。
使用動態數組
只有把指針當作數組名,使用索引訪問元素。原因是C和C++內部都使用指針處理數組。
不能修改數組名的值,但指針是變量,因此可以修改指針的值。
指針、數組和指針算術
指針變量加1后,增加的變量等于它指向的類型的字節數。
C++將數組名解釋為指針,多數情況下,將數組名解釋為數組第一個元素的地址。
在很多情況下,可以相同的方式使用指針名和數組名。可使用數組方括號表示法,也可以使用解除引用運算符*。在多數表達式中,它們都表地址,區別之一是,可以修改指針的指,而數組名是常量。另一個區別是,數組應用sizeof運算符得到的是數組的長度,對指針應用sizeof得到的是指針的長度,即使指針指向的是一個數組。
這種情況下,C++不會將數組名解釋為地址。
對數組名取地址時,數組名也不會被解釋為地址,這樣得到的是整個數組的地址。
指針小結
要聲明指向特定類型的指針,使用如下格式:
typeName * pointName;應將內存地址賦給指針,可以對變量名應用&運算符,來獲得被命名的內存的地址,new運算符返回未命名的內存的地址。
對指針解除引用意味著獲得指針指向的值,對指針應用解除引用或間接值運算符*來解除引用。
另一種對指針解除引用的方法是使用數組表示法。
在多數情況下,C++將數組名視為數組的第一個元素的地址。一種情況例外是,將sizeof運算符用于數組名時,此時返回整個數組的長度。
C++允許將指針與整數相加。相加的結果等于原來的地址加上指向的對象占用的總字節數。還可以兩個指針相關,得到一個整數,僅當兩個指針指向同一個數組(也可以指向超出結尾一個位置)時,這種運算才有意義,這將得到兩個元素的間隔。
使用數組聲明來創建數組時,將采用靜態聯編,即數組的長度在編譯時設置。
使用new []運算符創建數組時,將采用動態聯編(動態數組),即將在運行時為數組分配內存,其長度也在運行時設置。使用完這種數組后,應使用deldte []釋放其占用的內存。
使用方括號數組表示法等同于對指針解除引用。
指針和字符串
注意:在cout和多數C++表達式中,char數組名、char指針以及用引號括起的字符串常量都被解釋為字符串第一個字符的地址。
- 有些編譯器將字符串字面值視為只讀常量,不能修改。在C++中,字符串字面值都被視為常量。
- 有些編譯器只使用字符串字面值的一個副本來表示程序中的有的該字面值。C++不能保證字符串字面值被唯一地存儲。
不要使用字符串常量或示被初始化的指針來接收輸入。
注意在將字符串讀入程序時,應使用已分配的內存地址。該地址可以是數組名,也可以是使用new初始化過的指針。
strcpy()函數接受2個參數,第一個是目標地址,第二個是要復制的字符串的地址。
strncpy()函數還接受第3個參數——要復制的最大字符數。
警告:應使用strcpy()和strncpy(),而不是賦值運算符來將字符串賦給地址。
使用 new 創建動態結構
需要在程序運行時為結構分配所需的空間,也可使用new運算符來完成,創建動態結構。由于類與結構非常相似,所以本節有關結構的技術也適用與類。
將new用于結構需要兩步:創建結構和訪問其成員。
要創建結構,需要同時使用結構類型和new,將地址賦給指針。
創建動態結構時,不能使用成員運算符,因為這種結構沒有名稱只有地址,C++提供了一個運算符:箭頭成員運算符->用于指向結構的指針,就像點運算符可用于結構名稱一樣。
另一種訪問結構成員的方法是,如果ps是指向結構的指針,則*ps是被指向的值——結構本身,因此(*ps).price是該結構的成員。C++的運算優先規則要求使用括號。
自動存儲、靜態存儲和動態存儲
C++有三種管理數據內存的方式:自動存儲、靜態存儲和動態存儲(有時也叫作自由存儲空間或堆)。C++11新增了第四種類型——線程存儲。
自動存儲
在函數內部定義的常規變量使用自動存儲空間,被稱為自動變量,在所屬的函數被調用時自動產生,在該函數結束時消亡。
自動變量是一個局部變量,其使用域為包含它的代碼塊。
自動變量通常存儲在棧中,執行代碼塊時,其中的變量依次加入棧中,而離開代碼塊時,將按相反的順序釋放這些變量,這被稱為后進先出(LIFO)。
靜態存儲
靜態存儲是整個程序執行期間都存在的存儲方式。使變量成為靜態的方式有兩種:一種是在函數外面定義它;另一種是在聲明變量時使用關鍵字static。
C++實現還不支持對自動數組和自動結構的初始化。
動態存儲
new和delete運算符管理了一個內存池,這在C++中被稱為自由存儲空間(free store)或堆(heap)。該內存池與靜態變量和自動變量的內存是分開的。在棧中,自動添加和刪除機制使得占用的內存總是連續的,但new和delete的相互影響可能導致占用的自由內存區不連續。
數組的替代品
模板類vector和array是數組的替代品。
模板類 vector
模板類vector類似于string類,也是一種動態數組。它是使用new創建動態數組的替代品,實際上vector類確實是使用new和delete來管理內存,但其工作是自動完成的。
首先,使用vector對象,必須包含頭文件vector。
其次,vector包含在名稱空間std中,因此要使用using編譯指令、using聲明或std::vector。
第三,模板使用不同的語法來指出它存儲的數據類型。
第四,vector類使用不同的語法來指定元素數。
創建一個名為vt的vector對象,可存儲n_elem個類型為typeName的元素,其中參數n_elem可以是整型常量,也可以是整型變量。
模板類 array(C++11)
vector類的功能比數組強大,但付出的代價是效率低。如果需要長度固定的數組,使用數組是更佳選擇,但代價是不那么方便和安全。
C++11新增了模板類array,它也位于名稱空間std中。與數組一樣,array對象的長度也是固定,也使用棧(靜態內存分配),而不是自由存儲區,因此效率與數組相同,但更方便,更安全。要創建array對象,需要包含頭文件array。
創建一個名為arr的array對象,可包含n_elem個類型為typeName的元素,其中參數n_elem是整型常量,不可以是整型變量。
比較數組、vector 對象和 array 對象
首先,數組、vector對象和array對象,都可以使用標準數組表示法來訪問各個元素。
其次,array對象與數組存儲在棧中,而vector對象存儲在自由存儲區或堆中。
第三,可以將一個array對象賦給另一個array對象;而對于數組,必須逐元素復制數據。
使用中括號表示法時,C++不檢查索引是否非法,而vector對象和array對象的成員函數at()將在運行期間捕獲非法索引,而程序默認將中斷。這種額外檢查的代價是運行時間更長,這就是C++允許任何一種表示法的原因所在。它們包含成員函數begin()和end(),能夠確定邊界。
第 4 章總結
數組、結構和指針是C++的3種復合類型。數組可以在一個數據對象中存儲多個同種類型的值。通過
使用索引或下標,可以訪向數組中各個元素。
結構可以將多個不同類型的值存儲在同一個數據對象中,可以使用成員關系運算符.來訪問其中的
成員。使用結構的第一步是創建結構模板,它定義結構存儲了哪些成員。模板的名稱將成為新類型的標識符,然后就可以聲明這種類型的結構變量。
共用體可以存儲一個值,但是這個值可以是不同的類型,成員名指出了使用的模式。
指針是被設計用來存儲地址的變量。我們說,指針指向它存儲的地址。指針聲明指出了指針指向的對
象的類型。對指針應用解除引用運算符,將得到指針指向的位置中的值。
字符串是以空字符為結尾的一系列字符。字符串可用引號括起的字符串常量表示,其中隱式包含了結
尾的空字符。可以將字符串存儲在char數組中,可以用被初始化為指向字符串的char指針表示字符串。函數strlen()返回字符串的長度,其中不包括空字符。函數strcpy()將字符串從一個位置復制到另一個位置。在使用這些函數時,應當包含頭文件cstring或string.h。
頭文件string支持的C++strimg類提供了另一種對用戶更友好的字符串處理方法。具體地說,string對象將根據要存儲的字符串自動調整其大小,用戶可以使用賦值運算符來復制字符串。
new運算符允許在程序運行時為數據對象請求內存。該運算符返回獲得內存的地址,可以將這個地址
賦給一個指針,程序將只能使用該指針來訪問這塊內存。如果數據對象是簡單變量,則可以使用解除引用運算符(*)來獲得其值;如果數據對象是數組,則可以像使用數組名那樣使用指針來訪問元素;如果數據對象是結構,則可以用指針解除引用運算符->來訪問其成員。
指針和數組緊密相關。如果ar是數組名,則表達式ar[i]被解釋為*(ar+i),其中數組名被解釋為數組第一個元素的地址。這樣,數組名的作用和指針相同。反過來,可以使用數組表示法,通過指針名來訪問new分配的數組中的元素。
運算符new和delete允許顯式控制何時給數據對象分配內存,何時將內存歸還給內存池。自動變量是在函數中聲明的變量,而靜態變量是在函數外部或者使用關鍵字static聲明的變量,這兩種變量都不太靈活。自動變量在程序執行到其所屬的代碼塊(通常是函數定義)時產生,在離開該代碼塊時終止。靜態變量在整個程序周期內都存在。
C++98新增的標準模板庫(STL)提供了模板類vector,它是動態數組的替代品。C++11提供了模板
類array,它是定長數組的替代品。
總結
以上是生活随笔為你收集整理的C++ Primer Plus 学习笔记(第 4 章 复合类型)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node js批量导出PDF 导出压缩为
- 下一篇: C++:[编程题]买帽子