p95 設計良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。
p96陣列的維數必須用值大於等於1的常量表示式定義。此常量表示式只能包含整型字面值常量、列舉型別或者用常量表示式初始化的整型const物件。非const物件以及要到執行階段才知道其值的const變數都不能用於定義陣列的維數。
p97顯式初始化陣列元素:在定義陣列時,可為其提供一組用逗號分隔的初值,這些初值用花括號{}括起來,稱為初始化列表。此時編譯器會根據列出的元素個數來確定陣列的長度。如果指定了陣列維數,那麼初始化列表提供的元素個數不能超過維數值。如果維數大於列出的元素初值個數,則只初始化前面的陣列元素;剩下的其他元素,若是內建型別則初始化為0,若是類型別則呼叫該類的預設建構函式進行初始化。
p97特殊的字元陣列:字元陣列既可以用一組由花括號括起來、逗號隔開的字元字面值進行初始化,也可以用乙個字串字面值進行初始化。然而,字串字面值包含乙個額外的空字元(null)用於結束字串。
p98 與vector不同,乙個陣列不能用另外乙個陣列初始化,也不能將乙個陣列賦值給另乙個陣列。
p99 陣列下標的正確型別時size_t(vector下標的正確型別時vector::size_type)。
p100 與迭代器不同的是,指標用於指向單個物件,而迭代器只能用於訪問容器內的元素。
p101 取位址操作符只能用於左值。
p103 如果可能的話,除非所指向的物件已經存在,否則不要先定義指標,這樣可避免定義乙個未初始化的指標;如果必須分開定義指標和其所指向的物件,則將指標初始化為0。
p103對指標進行初始化或賦值只能使用以下四種型別的值:
(1)0值常量表示式;
(2)型別匹配的物件的位址;
(3)另一物件之後的下一位址;
(4)同型別的另乙個有效指標。
把int型變數賦給指標式非法的,但允許把數值0或在編譯時刻獲得0值得const量賦給指標。除了使用數值0或在編譯時值為0的const量外,還可以使用c++語言從c語言中繼承下來的預處理器變數null,該變數在cstdlib標頭檔案中定義,其值為0。
p104 c++提供了一種特殊的指標型別void*,它可以儲存任何型別物件的位址。void* 指標只支援幾種有限的操作:與另乙個指標進行比較;向函式傳遞void*指標或從函式返回void*指標;給另乙個void*指標賦值。不允許使用void*指標操縱它所指向的物件。
p105 定義引用時沒有初始化是錯誤的。
p106 c++使用**操作符指派乙個指標指向另乙個指標。
p107 指標的算術操作只有在原指標和計算出來的新指標都指向同乙個陣列的元素,或指向該陣列儲存空間的下一單元時才是合法的。
p107 兩個指標減法操作的結果是標準庫型別ptrdiff_t的資料。與size_t型別一樣,ptrdiff_t也是一種與機器相關的型別,在cstddef標頭檔案中定義。size_t是unsigned型別,而ptrdiff_t則是signed整型。
p108 使用下標訪問陣列時,實際上是 使用下標訪問指標/對指向陣列元素的指標做下標操作。只要指標指向陣列元素,就可以對它進行下標操作:
int *p = & ia[2];
int j = p[1];//p[1] equivalent to *(p+1), p[1] is the same element as ia[3]
p109 c++允許計算陣列或物件的超出末端的位址,但不允許對此位址進行解引用操作。而計算陣列超出末端位置之後或陣列首位址之前的位址都是不合法的。
p110~p112指向const物件的指標&const指標
&指向const物件的const指標
(1)c++強調要求指向const物件的指標也必須具有const特性:
constdouble *cptr;//cptr may point a double that is const
const限定了cptr指標所指向的物件型別,而非cptr本身。也就是說,cptr本身並不是const。在定義時不需要對它們進行初始化,如果需要的話,允許給cptr重新賦值,使其指向另乙個const物件。但不能通過cptr修改其所指物件對的指。
不能使用void *指標儲存const物件的位址,而必須使用const void *型別的指標儲存const物件的位址。
不允許把 const物件的位址 賦給 非const物件的指標;
允許把非const物件的位址 賦給 const物件的指標,但不能使用該const物件的指標修改非const物件的值。
(2)const指標本身的值不能修改,必須在定義時初始化。
int*const
curerr = &errnumb;
指標所指物件的值能否修改完全取決於該物件的型別。
(3)const double pi = 3.14159;
constdouble*constpi_ptr = π
p112 指標和typedef
理解複雜的const型別的宣告
p113 儘管c++支援c風格字串,但不應該在c++程式中使用這個型別。c風格字串常常帶來許多錯誤,是導致大量安全問題的根源。
p113 字串字面值的型別就是const char型別的陣列。
p113 c風格字串是以空字元null結束的字元陣列。
p113 c++語言通過(const) char*型別的指標來操縱c風格字串。
p114操縱c風格字串的標準庫函式
strlen(s)//返回s的長度,不包括字串結束符null
strcmp(s1, s2);//比較兩個字串s1和s2是否相同。若s1與s2相等,返回0;若s1大於s2,返回正數;若s1小於 s2,返回負數
strcat(s1, s2);//將字串s2連線到s1後,並返回s1
strcpy(s1, s2);//將s2複製給s1,並返回s1
strncat(s1, s2, n);//將s2的前n個字元連線到s1後面,並返回s1
strncpy(s1, s2, n);//將s2的前n個字元複製給s1,並返回s1
要使用這些標準庫函式,必須包含相應的c標頭檔案:
#include
傳遞給這些標準庫函式例程的指標必須具有非零值,並且指向以null結束的字元陣列中的第乙個元素。
如果必須使用c風格字串,則使用標準庫函式strncat和strncpy比strcat和strcpy函式更安全。
p114 c++語言提供普通的關係操作符實驗標準庫型別string物件的比較,這些操作符也可用於比較c風格字串的指標,但效果卻很不相同:實際上,此時比較的是指標上存放的位址值,而並非它們所指向的字串。
p117 陣列型別的變數有3個重要的限制:
(1)陣列長度固定不變;
(2)在編譯時必須知道其長度;
(3)陣列只在定義它的塊語句內存在。
相比之下,動態分配的陣列
(1)雖然長度時固定的,但不必在編譯時知道其長度,可以(通常也是)在執行時才確定陣列程度;
(2)將一直存在,知道程式顯示釋放它為止。
p117 動態分配陣列時,只需指定型別和陣列長度,不必為陣列物件命名,new表示式返回指向新分配陣列的第乙個元素的指標:
int *pia = new int[10];//array of 10 uninitialized ints
p117 動態分配陣列時,如果陣列元素具有類型別,將使用該類的預設建構函式實現初始化;如果陣列元素是內建型別,則無初始化。也可使用跟在陣列長度後面的一對空圓括號,對陣列元素做值初始化。
p118 如果不再需要使用動態建立的陣列,程式設計師必須顯式地將其占用的記憶體空間返還給程式的自由儲存區。
delete pia;
p121通常,由於c風格字串與字串字面值具有相同的資料型別,而且都是以空字元null結束,因此可以把c風格字串用在任何可以使用字串字面值的地方:
(1)可以使用c風格字串對string物件進行初始化或賦值;
(2)string型別的加法操作需要兩個運算元,可以使用c風格字串作為其中的乙個運算元,也允許將c風格字串用作復合賦值操作的右運算元。
反之則不成立:在要求c風格字串的地方不可直接使用標準庫string型別物件。但string類提供了乙個名為c_str的成員函式,返回c風格字串,其字面意思是:「返回c風格字串的表示方法」,即返回指向字元陣列首位址的指標,該陣列存放了與string物件相同的內容,並且以結束符null結束。
p121 使用陣列初始化vector物件,必須指出用於初始化式的第乙個元素以及陣列最後乙個元素的下乙個位置的位址。
c primer 第4章 陣列和指標
避免使用未初始化的指標 對指標進行初始化或賦值只能使用以下四種型別的值 把int型變數賦給指標是非法的,儘管int型變數的值可能為0.但允許把數值0或在編譯時可獲得0值的const量賦給指標。3.void 指標 c 提供了一種特殊的指標型別void 它可以儲存任何型別物件的位址 void 指標只支援...
C primer習題 第4章
習題 4.7 編寫必要的 將乙個陣列賦給另乙個陣列,然後把這段 改用 vector 實現。考慮如何將乙個 vector 賦給另乙個 vector。用陣列實現 include using namespace std intmain inta2 size for size t i 0 ii a2 i a...
第4章 陣列
1 陣列儲存的是相同型別的一組元素 double arr 2 陣列的定義型別可以是任意型別,包含基本型別或引用型別 string arr person arr int arr person arr 3 陣列屬於引用型別,引用儲存在棧中,值儲存在堆中,又稱為物件。4 陣列的成員如果不賦值,有預設值。b...