C 學習筆記 6

2021-08-30 14:40:47 字數 2139 閱讀 5909

通常,由於 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 函式返回的陣列。

const size_t arr_size = 6;

int int_arr[arr_size] = ;

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

vectorivec(int_arr, int_arr + arr_size);

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

vectorivec(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 學習筆記6

1.結構 結構除了可以含有屬性和字段,還可以包方法和構造器,但不能包含黠認 無引數 的構造器。有的時候 比如在例項化乙個陣列的時候 不會呼叫值型別的構造器,因為所有陣列記憶體都轉為用零來初始化,為了避免因為預設構造器只是偶爾呼叫而造成不一致,c 完全禁止了使用者顯式定義預設構造器,因為編譯器會將宣告...

C語言學習筆記6

最開始學習的時候從最簡單的程式設計開始學習,那麼我們都會看一些關於 c語言基礎書籍 把基礎打好之後我們會慢慢的看一些 c語言提高書籍 那麼接下來我們就繼續進行打基礎的工作。1 啟動vc 編譯系統 單擊 file 選單中 new 命令,進入vc 編譯系統介面,選擇 files 選項卡,選擇c 原始檔命...

C語言學習筆記6

魯迅先生曾說過,偉大的成績和辛勤勞動是成正比例的,有一分勞動就有一分收穫,日積月累,從少到多,奇蹟就可以創造出來。學習也是同等道理,日積月累,逐漸儲備知識就可以完成自己的理想。然而看 c語言程式設計教程 是儲備知識的乙個方法,所以現在就來看看我要學習的知識內容。if語句是大型程式使用最多的結構,不管...