第4章 陣列和指標
現代c++程式應使用vector和迭代器代替陣列和指標,除非前二者不滿足對效率的特殊要求
⒋⒈ 陣列
⒈ 陣列是由型別說明符、識別符號和維度組成的復合型別,能儲存一組某種型別的未命名物件
⒉ 定義和初始化
⑴ 型別說明符規定了存放於陣列中元素的型別
可使用除引用外的任意型別,包括陣列本身(陣列的陣列即**陣列)
⑵ 維數指定陣列中包含的元素個數,須用值大於等於
1的常量表示式定義,一經指定不可改變
⑶ 可以使用初值列表(用花括號括起的一組用逗號分隔的初值,可為空)顯式提供元素的初值
① 此時可不指定維數,陣列長度將由初值列表中的元素個數自動確定
② 若指定維數:
ⅰ 維數值不能小於初值個數
ⅱ 若維數值大於初始化列表中提供的元素個數,則只用初值列表初始化陣列中前面對應的元素
其餘元素,若為內建型別則初始化為0,若為類型別則呼叫預設建構函式
③ 對於**陣列,除第一維外其餘維數都須顯示指定
初值列表可內嵌花括號以指明各初值對應的位置,若不使用內嵌花括號則依次初始化
⑷ 若未提供初值列表,則陣列元素像普通變數一樣初始化
⑸ 使用字串字面值初始化字元陣列時注意前者結尾隱含的空字元
⒊ 不允許陣列直接複製和賦值
⒋ 陣列元素可通過下標操作符訪問,下標從0開始
下標越界將導致執行時錯誤
⒋⒉ 指標
⒈ 指標是一種能儲存物件位址的物件
⒉ 定義和初始化
⑴ 形式: 型別名* 識別符號;
型別名指定指標指向物件的型別(型別名為void時指標可指向任意型別的物件)
① 連續宣告多個指標時,每個識別符號前都要加*號
② 可以連續使用多個星號*表示指向指標的指標
③const限定符
ⅰ 指向const物件的指標
a形式:const型別名* 識別符號;
(或 型別名const* 識別符號;)
bconst物件只能與這種指標關聯
c不能通過這種指標修改所指物件,無論所指是否為const
由於有此特性,該種指標常用作函式形參以防止所指物件被意外修改
ⅱconst指標
a形式:型別名*const識別符號
b指標本身的值不能修改,即不能改變指向,但可以改變所指物件的值
ⅲ 指向const物件的const指標
a形式:const型別名*const識別符號
b既不能改變所指物件的值,也不能改變指向
ⅳtypedeft* pt; 則constpt t 和 ptconstt 均與 t*constt 等價
④ 指向陣列的指標
ⅰ 形式: 型別名 (*識別符號)[維數][維數]..[維數];
ⅱtypedef型別名新型別名[維數][維數]..[維數];
得到陣列型別的別名,可以此簡化定義
⑵ 應避免使用未初始化的指標
而乙個有效的指標必然為以下三種狀態之一:
① 儲存某確定物件的位址
② 指向乙個物件的下一位置
③ 值為0
因此在對指標初始化和賦值時只能使用:
① 值為0的常量表示式
② 型別匹配的物件的位址(使用取位址操作符&獲得,該運算子只能對左值使用)
③ 另一物件下一位置的位址
④ 同型別另一有效指標
⒊ 指標操作
⑴ 使用解引用操作符*可以獲得指標指向物件的左值,從而操作所指物件
而對指標直接進行賦值等操作將改變指標本身的值,使指標指向另一物件
⑵ 指標可被當作陣列的迭代器,用以訪問陣列元素
① 指標的算術操作
ⅰ 指標與整型值相加(減),得到指向所指元素向後(前)移動相應位置的陣列元素的新指標
ⅱ 兩個指向同一陣列中元素的指標(含超出末端指標)相減,得到乙個ptrdiff_t型(定義在標頭檔案 cstddef 中,signed整型)結果,表示兩指標所指元素間的距離
② 對指標進行下標操作,返回所指元素向後(前)移動相應位置的陣列元素引用
③ 可以計算超出末端指標,但不允許對其進行解引用操作
計算越界指標也是非法的
⑶void* 指標不支援以上操作
⒋⒊ c風格字串
⒈ c風格字串是以空字元結尾的字元陣列
字串字面值就是其實例
⒉ c風格字串的標準庫函式(標頭檔案 cstring)
傳給以下庫函式的須為指向以空字元結尾的字元陣列的非零指標
⑴size_tstrlen(char*str );
返回字串長度(不包括結尾的空字元)
⑵intstrcmp(constchar*str1,constchar*str2 );
比較兩個字串,如果前者大於後者返回正數,小於返回負數,等於返回0
注:不能使用》,<,==操作符比較,它們只會比較存放位址而不會比較字串
⑶char*strcat(char*str1,constchar*str2 );
將str2連線到str1後面,並返回str1
此函式不進行越界檢查
⑷char*strcpy(char*to,constchar*from );
將str2複製到str1字串,並返回str1
此函式不進行越界檢查
⑸char*strncat(char*str1,constchar*str2,size_tcount );
將str2的前至多count個字元連線到str1後面,並返回str1
如果越界則截斷字串,因此比strcat安全
⑹char*strncpy(char*to,constchar*from,size_tcount );
將str2的前至多count個字元複製到str1,並返回str1
如果越界則截斷字串,因此比strcpy安全
⒊ 對於大部分程式而言,標準庫型別 string 無論安全性還是效率均強過c風格字串,因此應盡可能使用 string
第4章陣列和指標
陣列的定義和初始化 注意 1.顯示初始化陣列元素 在函式體外定義的內建陣列,其元素均初始化為0 在函式體內定義的內建陣列,其元素無初始化 不管陣列在 定義,如果其元素為類型別,則自動呼叫該類的預設建構函式進行初始化,如果該類沒有預設建構函式,則必須為該陣列的元素提供顯式的初始化。2.特殊的字元陣列 ...
第4章 陣列和指標 8
4.3.1 建立動態陣列 陣列型別的變數有三個重要的限制 陣列長度固定不變,在編譯時必須知道長度,陣列只在定義它的塊語句內存在。雖然陣列長度是固定的,但動態分配的陣列不必在編譯時知道其長度,可以 通常也是 在執行時才確定陣列長度。與陣列變數不同,動態分配的陣列將一直存在,直到程式顯式釋放它為止。每乙...
c primer 第4章 陣列和指標
避免使用未初始化的指標 對指標進行初始化或賦值只能使用以下四種型別的值 把int型變數賦給指標是非法的,儘管int型變數的值可能為0.但允許把數值0或在編譯時可獲得0值的const量賦給指標。3.void 指標 c 提供了一種特殊的指標型別void 它可以儲存任何型別物件的位址 void 指標只支援...