第 章 陣列和指標

2021-07-02 13:32:12 字數 3697 閱讀 5855

第4章 陣列和指標

現代c++程式應使用vector和迭代器代替陣列和指標,除非前二者不滿足對效率的特殊要求

⒋⒈ 陣列

⒈ 陣列是由型別說明符、識別符號和維度組成的復合型別,能儲存一組某種型別的未命名物件

⒉ 定義和初始化

⑴ 型別說明符規定了存放於陣列中元素的型別

可使用除引用外的任意型別,包括陣列本身(陣列的陣列即**陣列)

⑵ 維數指定陣列中包含的元素個數,須用值大於等於

1的常量表示式定義,一經指定不可改變

⑶ 可以使用初值列表(用花括號括起的一組用逗號分隔的初值,可為空)顯式提供元素的初值

① 此時可不指定維數,陣列長度將由初值列表中的元素個數自動確定

② 若指定維數:

ⅰ 維數值不能小於初值個數

ⅱ 若維數值大於初始化列表中提供的元素個數,則只用初值列表初始化陣列中前面對應的元素

其餘元素,若為內建型別則初始化為0,若為類型別則呼叫預設建構函式

③ 對於**陣列,除第一維外其餘維數都須顯示指定

初值列表可內嵌花括號以指明各初值對應的位置,若不使用內嵌花括號則依次初始化

⑷ 若未提供初值列表,則陣列元素像普通變數一樣初始化

⑸ 使用字串字面值初始化字元陣列時注意前者結尾隱含的空字元

⒊ 不允許陣列直接複製和賦值

⒋ 陣列元素可通過下標操作符訪問,下標從0開始

下標越界將導致執行時錯誤

⒋⒉ 指標

⒈ 指標是一種能儲存物件位址的物件

⒉ 定義和初始化

⑴ 形式: 型別名* 識別符號;

型別名指定指標指向物件的型別(型別名為void時指標可指向任意型別的物件)

① 連續宣告多個指標時,每個識別符號前都要加*號

② 可以連續使用多個星號*表示指向指標的指標

const限定符

ⅰ 指向const物件的指標

a形式:const型別名* 識別符號;

(或 型別名const* 識別符號;)

const物件只能與這種指標關聯

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 指標只支援...