C Primer 學習筆記(三) 陣列和指標

2021-06-07 13:45:45 字數 3608 閱讀 4754

首先需明確,現代c++程式應盡量使用vector和迭代器型別,而避免使用低階的陣列和指標。設計良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。

一、陣列

1、陣列的定義和初始化

(1)陣列的維數必須用值大於等於1的常量表示式定義。此常量表示式只能為:整型字面值常量、列舉常量或者用常量表示式初始化的整型const物件(此處的「陣列」不包括「動態陣列」)。

(2)若沒有顯式的提供元素初值,則陣列元素會像普通變數一樣初始化(函式體外定義,內建型別陣列,均初始化為0;函式體內定義,內建型別陣列,均無初始化)。

(3)字元陣列有兩種方式初始化:

a、用一組由花括號括起來、逗號隔開的字元字面值初始化;

b、用乙個字串字面值進行初始化。

注意,c++中所有的字串字面值都由編譯器自動在末尾新增乙個空字元'\0'。若使用a方法初始化,記得顯式新增'\0'。最好使用b方法初始化。

但是,用字串字面值初始化乙個string物件時,空字元'\0'並不加入string物件中。

(4)陣列不允許直接複製和賦值。此外,只有字元陣列或char型指標可由cout直接輸出,其他型別陣列,必須顯式的迴圈輸出每個元素。

2、陣列操作

(1)陣列下標的正確型別為size_t(定義在cstddef標頭檔案中,機器相關的無符號整型),vector的下標型別為vector::size_type,string的下標型別為string::size_type。

(2)必須保證陣列下標值在正確範圍之內。

二、指標

1、指標的定義和初始化

(1)指標的資料型別是指標所指向的物件的型別。

(2)兩種宣告指標的風格:

string *pstring;

string* pstring;

建議使用第一種。

(3)指標可能的取值有三種:儲存乙個特定物件的位址;指向某個物件後面的另一物件;0值(null)。若指標儲存0值,表明它不指向任何物件。

(4)避免使用未初始化的指標。

c++語言無法檢測指標是否未被初始化。

如果可能的話,除非所指向的物件已經存在,否則不要先定義指標。

如果必須分開定義指標和其所指向的物件,則將指標初始化為0(null)。

(5)c++中的void * 指標。

void * 指標僅支援幾種操作:與另乙個指標進行比較;向函式傳遞void * 指標或從函式返回void * 指標;給另乙個void * 指標賦值。不允許使用void * 指標操作它所指向的物件。

2、指標操作

(1)指標與引用的比較。

區別一,引用總是指向某個物件,且定義引用時必須同時初始化;

區別二,給引用賦值修改的是該引用所關聯的物件的值。

(2)指標是陣列的迭代器。內建陣列型別具有標準庫容器的許多性質。

3、指標與const限定符

(1)指向const物件的指標

a、可以把指向const物件的指標理解為「自以為指向const物件的指標」。因為這種指標既可以指向const物件,也可以指向非const物件。但是由於系統沒法分辨所指向的物件是否為const,因此系統會把它所指的物件都視為const。如此一來,不允許利用這種指標修改所指向的物件(對於非const物件來說,當然可以通過其他方法修改物件值)。 b、

const double *cptr;

const void *cpv;

const限定了cptr指標所指向的物件型別,而非cptr本身。因此,cptr本身並不是const,在定義時無需初始化,且允許給cptr重新賦值,使其指向另乙個const(或非const)物件。

c、實際程式中,指向const物件的指標常用作函式的形參。有兩個好處,一是此形參既可以接受const物件,也可以接受非const物件;二是確保傳遞給函式的實際物件在函式中不因為形參而被修改。

(2)const指標

a、const指標——指標本身的值不能修改。在定義時必須同時初始化,且初始化之後,不能使這個指標再指向其他物件。

int errnumb = 0;

int *const curerr = &errnumb;

b、const指標所指物件的值能否修改完全取決於該物件的型別。

(3)指向const物件的const指標

首先是個const指標,其指向乙個const物件。兼具(1)(2)所述兩種性質。

const double pi = 3.14159;

const double *const pi_ptr = π

(4)const限定符既可以放在型別前面,也可以放在型別後:

string const s1;

const string s2;

放在型別前面更常見,但是放在型別後面更有助於理解。

三、c風格字串

1、c風格字串

(1)c風格字串是以空字元null結束的字元陣列。字串字面值是該型別的例項。

(2)處理c風格字串的庫函式的標頭檔案為:cstring。這是string.h標頭檔案的c++版本。

(3)在使用cstring中的庫函式處理c風格字串時,牢記字串必須以結束符null('\0')結束。strlen(s),返回s的長度,不包括字串結束符null。

2、動態陣列

(1)動態分配的陣列不必在編譯時知道其長度(動態陣列的維度可以為普通變數),通常在執行時才確定陣列長度。

(2)動態分配陣列時,如果陣列元素具有類型別,將使用該類的預設建構函式實現初始化;若陣列元素是內建型別,則無初始化。也可使用跟在陣列長度後的一對空圓括號做初始化(但也只能初始化為元素型別的預設值,無法初始化為指定值)。

int *pia = new int[20]();

(3)必須顯式的釋放動態空間,對於二維動態陣列,先釋放內層,再釋放外層。

for(size_t i = 0; i != arr_size; ++i)

delete p[i];

delete p;

3、新舊**相容

(1)c_str函式返回c風格字串,返回指向字元陣列首位址的指標(此指標指向const char型別的陣列),該陣列存放了與string物件相同的內容,並且以結束符null結束。

string st("hello world!");

const char *str = st.c_str();

(2)使用陣列初始化vector物件

const size_t arr_size = 3;

int int_arr[arr_size] = ;

vectorivec(int_arr, int_arr + arr_size);

4、指向陣列的指標與指標陣列

int *ip[4];  //array of pointers to int

int (*ip)[4]; //pointer to an array of 4 ints

第乙個為指標陣列,第二個為指向含有4個元素的陣列的指標。

C primer學習筆記(三)

注意事項 sizeof是乙個運算子,而不是函式,雖然用起來非常像函式。作用 返回乙個型別或變數的位元組長度。用法 位於std命名空間內有控制符 dec oct 和 hex,用於更改cout輸出數時的預設進製,預設為十進位制。使用方法如下 其他相關 省略 using namespace std int...

c primer學習筆記3 陣列和指標

現代c 程式應盡量使用vector和迭代器型別,而避免使用低階別的陣列和指標。設計良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。1 字串字面值以空字元結尾 2 陣列下標的正確型別是size t 1 指標與引用 a.引用必須初始化,而指標不必,故指標使用時必須檢查是否為空 b.引用一旦初始...

C Primer 學習筆記 函式(三)

返回陣列指標 type function parameter list dimension int func int i 10 func int i 是乙個帶引數i的函式func func int i 對函式的呼叫結果進行解引用,即呼叫結果是乙個指標 int func int i 10 此指標指向1...