第4章 陣列和指標
現代c++程式應使用vector和迭代器代替陣列和指標,除非前二者不滿足對效率的特殊要求
⒋⒈ 陣列
⒈ 陣列是由型別說明符、識別符號和維度組成的復合型別,能儲存一組某種型別的未命名物件
⒉ 定義和初始化
⑴ 型別說明符規定了存放於陣列中元素的型別
可使用除引用外的任意型別,包括陣列本身(陣列的陣列即****陣列**)
⑵ 維數指定陣列中包含的元素個數,須用值大於等於1的常量表示式定義,一經指定不可改變
⑶ 可以使用初值列表(用花括號括起的一組用逗號分隔的初值,可為空)顯式提供元素的初值
① 此時可不指定維數,陣列長度將由初值列表中的元素個數自動確定
② 若指定維數:
ⅰ 維數值不能小於初值個數
ⅱ 若維數值大於初始化列表中提供的元素個數,則只用初值列表初始化陣列中前面對應的元素
其餘元素,若為內建型別則初始化為0,若為類型別則呼叫預設建構函式
③ 對於**陣列,除第一維外其餘維數都須顯示指定
初值列表可內嵌花括號以指明各初值對應的位置,若不使用內嵌花括號則依次初始化
⑷ 若未提供初值列表,則陣列元素像普通變數一樣初始化
⑸ 使用字串字面值初始化字元陣列時注意前者結尾隱含的空字元
⒊ 不允許陣列直接複製和賦值
⒋ 陣列元素可通過下標操作符訪問,下標從0開始
下標越界將導致執行時錯誤
⒋⒉ 指標
⒈ 指標是一種能儲存物件位址的物件
⒉ 定義和初始化
⑴ 形式: 型別名* 識別符號;
型別名指定指標指向物件的型別(型別名為 void 時指標可指向任意型別的物件)
① 連續宣告多個指標時,每個識別符號前都要加號
② 可以連續使用多個星號表示指向指標的指標
③ const 限定符
ⅰ 指向 const 物件的指標
a形式: const 型別名* 識別符號;
(或 型別名 const* 識別符號;)
b const 物件只能與這種指標關聯
c不能通過這種指標修改所指物件,無論所指是否為 const
由於有此特性,該種指標常用作函式形參以防止所指物件被意外修改
ⅱ const 指標
a形式:型別名* const 識別符號
b指標本身的值不能修改,即不能改變指向,但可以改變所指物件的值
ⅲ 指向 const 物件的 const 指標
a形式: const 型別名* const 識別符號
b既不能改變所指物件的值,也不能改變指向
ⅳ typedef t* pt; 則 const pt t 和 pt const t 均與 t* const t 等價
④ 指向陣列的指標
ⅰ 形式: 型別名 (*識別符號)[維數][維數]…[維數];
ⅱ typedef 型別名新型別名[維數][維數]…[維數];
得到陣列型別的別名,可以此簡化定義
⑵ 應避免使用未初始化的指標
而乙個有效的指標必然為以下三種狀態之一:
① 儲存某確定物件的位址
② 指向乙個物件的下一位置
③ 值為0
因此在對指標初始化和賦值時只能使用:
① 值為0的常量表示式
② 型別匹配的物件的位址(使用取位址操作符&獲得,該運算子只能對左值使用)
③ 另一物件下一位置的位址
④ 同型別另一有效指標
⒊ 指標操作
⑴ 使用解引用操作符可以獲得指標指向物件的左值,從而操作所指物件
而對指標直接進行賦值等操作將改變指標本身的值,使指標指向另一物件
⑵ 指標可被當作陣列的迭代器,用以訪問陣列元素
① 指標的算術操作
ⅰ 指標與整型值相加(減),得到指向所指元素向後(前)移動相應位置的陣列元素的新指標
ⅱ 兩個指向同一陣列中元素的指標(含超出末端指標)相減,得到乙個 ptrdiff_t 型(定義在標頭檔案 cstddef 中, signed 整型)結果,表示兩指標所指元素間的距離
② 對指標進行下標操作,返回所指元素向後(前)移動相應位置的陣列元素引用
③ 可以計算超出末端指標,但不允許對其進行解引用操作
計算越界指標也是非法的
⑶ void 指標不支援以上操作
⒋⒊ c風格字串
⒈ c風格字串是以空字元結尾的字元陣列
字串字面值就是其實例
⒉ c風格字串的標準庫函式(標頭檔案 cstring)
傳給以下庫函式的須為指向以空字元結尾的字元陣列的非零指標
⑴ size_t strlen( char *str );
返回字串長度(不包括結尾的空字元)
⑵ int strcmp( const char *str1, const char *str2 );
比較兩個字串,如果前者大於後者返回正數,小於返回負數,等於返回0
注:不能使用》,<,==操作符比較,它們只會比較存放位址而不會比較字串
⑶ char *strcat( char *str1, const char *str2 );
將str2連線到str1後面,並返回str1
此函式不進行越界檢查
⑷ char *strcpy( char *to, const char *from );
將str2複製到str1字串,並返回str1
此函式不進行越界檢查
⑸ char *strncat( char *str1, const char *str2, size_t count );
將str2的前至多count個字元連線到str1後面,並返回str1
如果越界則截斷字串,因此比strcat安全
⑹ char *strncpy( char *to, const char *from, size_t count );
將str2的前至多count個字元複製到str1,並返回str1
如果越界則截斷字串,因此比strcpy安全
⒊ 對於大部分程式而言,標準庫型別 string 無論安全性還是效率均強過c風格字串,因此應盡可能使用 string
第四章 讀書筆記
源 包含了許多的東西,包括 android 應用程式的 android sdk 自帶的工具,android ndk 的源 等等,所以單從數量上來講,android linux 終端執行命令來配置 android12 repo 指令碼檔案 3 建立用於存放 android 源 的目錄 4 初始化 5a...
C Primer 第四章筆記
左值和右值 乙個左值表示式的求職結果是乙個物件或者乙個函式,然而以常量物件為代表的某些左值實際上不能作為賦值語句的左側運算物件。當乙個物件用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 對於某些沒有執行順序的運算子來說,如果表示式指向並修改了同乙個物...
第四章讀書筆記 程序排程
多工作業系統就是能同時併發的互動執行多個程序的作業系統 多工作業系統分為 程序可以被分為 linux採用了兩種不同的優先順序範圍 時間片 被搶占之前持續執行的時間 linux排程器是以模組方式提供的,其目的是為了允許不同型別的程序可以有針對性的選擇演算法 現代程序排程器有兩個通用的概念 程序優先順序...