天天看點

C++學習筆記——6

通常,由于 C 風格字元串與字元串字面值具有相同的資料類型,而且都是以空字元 null 結束,是以可以把 C 風格字元串用在任何可以使用字元串字面值的地方:

可以使用 C 風格字元串對 string 對象進行初始化或指派。

string 類型的加法操作需要兩個操作數,可以使用 C 風格字元串作為其中的一個操作數,也允許将 C 風格字元串用作複合指派操作的右操作數。

反之則不成立:在要求C風格字元串的地方不可直接使用标準庫 string 類型對象。例如,無法使用 string 對象初始化字元指針:

char *str = st2; // compile-time type error

但是,string 類提供了一個名為 c_str 的成員函數,以實作我們的要求:

char *str = st2.c_str(); // almost ok, but not quite

c_str 函數傳回 C 風格字元串,其字面意思是:“傳回 C 風格字元串的表示方法”,即傳回指向字元數組首位址的指針,該數組存放了與 string 對象相同的内容,并且以結束符 null 結束。

如果 c_str 傳回的指針指向 const char 類型的數組,則上述初始化失敗,這樣做是為了避免修改該數組。正确的初始化應為:

const char *str = st2.c_str(); // ok

c_str 傳回的數組并不保證一定是有效的,接下來對 st2 的操作有可能會改變 st2 的值,使剛才傳回的數組失效。如果程式需要持續通路該資料,則應該複制 c_str 函數傳回的數組。

不能用一個數組直接初始化另一數組,程式員隻能建立新數組,然後顯式地把源數組的元素逐個複制給新數組。這反映 C++ 允許使用數組初始化 vector 對象,盡管這種初始化形式起初看起來有點陌生。使用數組初始化 vector 對象,必須指出用于初始化式的第一個元素以及數組最後一個元素的下一位置的位址:

const size_t arr_size = 6;

int int_arr[arr_size] = {0, 1, 2, 3, 4, 5};

// ivec has 6 elements: each a copy of the corresponding element in int_arr

vector<int> ivec(int_arr, int_arr + arr_size);

傳遞給 ivec 的兩個指針标出了 vector 初值的範圍。第二個指針指向被複制的最後一個元素之後的位址空間。被标出的元素範圍可以是數組的子集:

// copies 3 elements: int_arr[1], int_arr[2], int_arr[3]

vector<int> ivec(int_arr + 1, int_arr + 4);

對于多元數組,如果表達式隻提供了一個下标,則結果擷取的元素是該行下标索引的内層數組。如 ia[2] 将獲得ia 數組的最後一行,即這一行的内層數組本身,而并非該數組中的任何元素。

因為多元數組其實就是數組的數組,是以由多元數組轉換而成的指針類型應是指向第一個内層數組的指針。盡管這個概念非常明了,但聲明這種指針的文法還是不容易了解:

int ia[3][4]; // array of size 3, each element is an array of ints of size 4

int (*ip)[4] = ia; // ip points to an array of 4 ints

ip = &ia[2]; // ia[2] is an array of 4 ints

typedef 類型定義(第 2.6 節)可使指向多元數組元素的指針更容易讀、寫和了解。以下程式用 typedef 為 ia 的元素類型定義新的類型名:

typedef int int_array[4];

int_array *ip = ia;

可使用 typedef 類型輸出 ia 的元素:

for (int_array *p = ia; p != ia + 3; ++p)

for (int *q = *p; q != *p + 4; ++q)

cout << *q << endl;

外層的 for 循環首先初始化 p 指向 ia 的第一個内部數組,然後一直循環到 ia 的三行資料都處理完為止。++p 使 p 加 1,等效于移動指針使其指向 ia 的下一行(例如:下一個元素)。

内層的 for 循環實際上處理的是存儲在内部數組中的 int 型元素值。首先讓 q 指向 p 所指向的數組的第一個元素。對 p 進行解引用獲得一個有 4 個 int 型元素的數組,通常,使用這個數組時,系統會自動将它轉換為指向該數組第一個元素的指針。在本例中,第一個元素是int型資料,q指向這個整數。系統執行内層的 for 循環直到處理完目前 p 指向的内部數組中所有的元素為止。當 q 指針剛達到該内部數組的超出末端位置時,再次對 p 進行解引用以獲得指向下一個内部數組第一個元素的指針。在 p 指向的位址上加 4 使得系統可循環處理每一個内部數組的 4 個元素。

c++ c c#