C primer第二次閱讀學習筆記(第4章)

2021-06-06 12:50:04 字數 2611 閱讀 7425

c++語言應盡量使用

vector

和迭代器型別,應避免使用低階的陣列和指標,涉及良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。因此要向成為乙個真正的

c++程式設計師就要多使用

vector

和string

來替代陣列和

c風格字串。

陣列的維數必須用整型常量指定,非const

型別或是到執行時才知道其值的

const

變數都不能用於定義陣列的維數。

在沒有顯式提供元素的初始時陣列元素會像普通元素一樣初始化。若在函式體外定義的陣列,所有元素將會被初始化為0

,若是在函式體外定義的陣列,其元素不會被初始化。如果陣列元素為類型別,無論陣列在**定義,都會自動呼叫類的預設建構函式來初始化。如果類沒有預設建構函式,則必須為陣列的元素提供顯式的初始化。這一點與

vector

類似。

與vector

中的size_type

類似,陣列下標的正確型別為

size_t

;頭指標和尾指標只差的正確型別為

ptrdiff_t

,它是signed

型別。

使用指標不當易導致錯誤發生,應將未初始化的指標初始化為null

,因為編譯器可以測出

0值的指標。這在一定程度上可以避免指標未初始化就使用的情況。

void*型別的指標可以儲存任何型別的指標。它表明該指標與某一位址值相關,但不清楚儲存在此位址上的物件的型別。

void*

型別的指標只支援幾種有限的操作:

1,與另乙個指標比較

2,向函式傳遞

void*

指標或是從函式中返回

void*

指標。3

,給另乙個

void*

指標賦值。但是不允許使用

void*

操作它指向的物件。

實際中常把指向const

的指標用作函式形參,以此確保傳遞給該函式的實際物件不會再函式中被修改。這也說明了,指向

const

的指標,既可以指向

const

物件也可以指向非

const

物件。

使用const

定義變數時,

const int a;

與int const a;

是等價的。這樣就容易導致混淆。如     

typedef int *intptr;

const intptr pp;

此時pp

是什麼型別呢。真正的型別應該是將

pp定義為指向

int型別的

const

指標。它等價於

int * const pp;

原因是在

const  intptr  pp

等價於intptr  const  pp

, const

作用於intptr

型別。而不是跟

const int a 

一樣作用於

a。所以盡量寫成

intptr  const  pp

這種形式,此時便不會誤會。

動態分配陣列時可以在陣列長度後面加一對空圓括號,對陣列的元素進行初始化。此時陣列元素都被初始化為0

;如int *array=new int[10]();

建立const

物件的動態陣列時必須為陣列元素提供初始化,因為陣列元素都是

const

物件。如

const int *array=new const int[100]();

動態分配的陣列空間要呼叫delete 

進行釋放。漏用【】

,編譯器無法發現此錯誤,會導致少釋放記憶體空間,導致記憶體洩露。

string成員函式

c_str()

返回const

型別的陣列指標,因此不能被修改。另外一旦

string

物件被改變,

c_str()

返回的陣列就會變為無效,也就是說

c_str()

返回的陣列是在呼叫函式時才對

string

物件內容的拷貝,並不實時反映

string

物件的內容。

可以使用陣列為vector

物件初始化。如

int a=;vectorv(a,a+7);

兩個指標標示出

vector

初值的範圍,第二個指標指向陣列最後乙個元素的後乙個位址空間。

區分指標陣列與行指標。如int *ptr[10],

此為指標陣列,

int (*ptr)[10]

此為行陣列,

p為指向具有

10個元素的陣列的指標。 

平時經常使用typedef  int *ptr

;來簡化操作。但是對於

typedef int int_array[4];

很不熟悉,可以參照

typedef int *ptr;

來理解。

int_array p;

定義乙個具體有四個元素的陣列。而

int_array *p

定義乙個指向具有四個元素陣列的行指標

C primer第二次閱讀學習筆記(第3章)

第三章 在標頭檔案中應該使用完全限定的標準庫名字,如std cout 而不應該使用 using std cout 或using namespaces std 在標頭檔案中放置 using 宣告,就相當於在包含該標頭檔案的每個程式中都放置了同一 using 宣告。應該在標頭檔案中包含確實需要的東西,遵...

C primer第二次閱讀學習筆記(第5章)

對於兩個數的除法和求模,若均為正,則結果均為正。若均為負,除法結果為正,取模的結果為負。若一正一負,則結果依賴於具體編譯器。之所以不能串聯使用關係操作符如if i,因為關係操作符具有左結合特性。i首先比較,比較的結果為0或 1,然後在與 k進行比較,只要 k 1,結果恒為真。對於判斷與bool 值相...

C primer第二次閱讀學習筆記(第6章)

第六章 在switch 中只有在最後乙個 case 或是default 語句之後才能定義變數,之所以這樣規定是為了避免 跳過變數定義和初始化。如switch val 為了解決這種情況,可以為每個case 語句新增 花括號,引入塊語句,在該塊定義的變數只能在該語句塊中使用。對於do while 迴圈d...