C++複習總結(四)

學習網站:http://www.learncpp.com/

圖片總是不能一直複製粘貼。還好有云文檔。

數組中的第一個元素是testScore [0]。即下標從零開始。對於長度爲N的數組,數組元素從0N-1編號!這被稱爲數組的範圍。即testScore[N]是代表從testScore[0]testScore[N-1]的數組。如testScore[2]即有testScore[0]testScore[1]兩個數。Int exe[3] : 即生成了有3個位置的數組。{exe[0],exe[1],exe[2]}

 

如果直接輸出該數組,輸出的將是該數值的地址

 

可以用結構體struct生成數組,具體方法爲:

1

2

3

4

5

6

struct Rectangle

{

    int length;

    int width;

};

Rectangle rects[5]; // declare an array of 5 Rectangle

要訪問數組元素的結構成員,首先選擇你想要的數組元素,然後使用成員選擇操作符來選擇你想要的結構成員

1

rects[0].length = 24;

 

以下情況C++數組已經發生溢出,只是因爲C++只是在數組界限那裏畫了條線,而不是定死了,所以沒有出錯。

 

 

C++中求數組的長度:用數組的字節數/數組[0]的字節數,得到數組的長度。

 

初始化器列表:int prime[5] = { 2, 3, 5, 7, 11 }; // 初始化器列表初始化五個數字,而不用一個一個初始化。

如果初始化列表的長度小於其數組的長度,未被初始化的其餘元素將被初始化爲0int prime[5] = { 2, 3, 5};

要將數組中的所有元素初始化爲0,可以這樣:int prime[5] = { }

省略長度:如果使用初始化器列表初始化固定的元素數組,編譯器可以爲您計算出數組的長度,並且可以省略顯式聲明數組的長度。以下兩行是等同的:

1

2

int array[5] = { 0, 1, 2, 3, 4 }; // explicitly define length of the array

int array[] = { 0, 1, 2, 3, 4 }; // let initializer list set length of the array

 

枚舉中的元素會隱式的轉換爲整數:如enum num{a,b,c,d}a.b.c.d分別隱式的代表0123這四個數字。

可以將枚舉中的元素顯式的轉換爲一個整數,使用static_cast<int>(num::a) 可以將num::a顯示的轉化爲0

 

重:在C++中,傳遞普通變量是傳遞其副本,而當傳遞一個數組時是傳遞其實際數組。當操作傳遞過來的普通變量時,原變量不會改變。而操作傳遞過來的數組時,原數組也會相應的被修改。

 

Std::swapx,y)函數用於交換兩個數。

std::swap(x, y); // 交換xy的值。

 

我們回憶一下Java簡單的排序吧:

選擇排序:遍歷整個數組,取出最小值,然後將最小值放到第一個位置,依次遍歷。即雙層嵌套循環,內層找最小值,外層確定從哪個下標開始找最小值。

 

冒泡排序:比較相鄰兩個數字,大的放到前面,小的放到後面,依次比較,直到排序完整個數組。即雙層嵌套循環,內圈比較最值(向前冒泡的話控制開始頭,向後冒泡的話控制結束尾),外圈設置比較次數,每個值放置一次位置。

 

初始化二維數組:

int array[3][5] =

{

{ 1, 2, 3, 4, 5 }, // row 0

{ 6, 7, 8, 9, 10 }, // row 1

{ 11, 12, 13, 14, 15 } // row 2

};

 

編譯器可以計算出數組長度是多少。但是,以下是不允許的:

int array[][] =

{

{ 1, 2, 3, 4 },

{ 5, 6, 7, 8 }

};

 

就像普通數組一樣,多維數組仍然可以初始化爲0,如下所示:

int array[3][5] = { 0 };

 

訪問多維數組一般需要多層嵌套循環,一層代表一個循環。

 

重:運算符地址(&)允許我們查看分配給變量的內存地址:即&代表取地址符。

解除引用運算符(*)允許我們訪問特定地址的值:即*&p取出該地址所存放的值。

指針存儲變量的地址(int* p),定義了一個int型的指針—> p。如果直接寫*p的話,代表聲明一個指針。如果*&p)的話,代表解引用。

int *ptr = &value; // 由指針(*ptr)指向獲取的地址(&value)。

 

std::cout << typeid(&x).name(); // typeid().name() 獲取變量名字

 

記得int* 是一種數據類型,代表int型的指針。

 

解引用指針存儲變量的值(* int* p),解除了一個int型的指針。

32位機器上的指針爲32位(4字節)。對於64位可執行文件,指針可以是64位(8字節)。無論指向什麼,指針的大小都不會改變。

 

對於固定數組來說,[0]位的指針代表該數組的內存地址。

 

 

一個空值是一個特殊值,這意味着該指針沒有任何東西在指向。一個保存空值的指針被稱爲空指針。

 

重:我們實際上並不是取消引用數組本身。該數組(int [5]類型)被隱式轉換爲一個指針(類型爲int *,我們取消引用指針以獲取指針所保存的內存地址的值(數組的第一個元素的值)。

 

所以我們在聲明定義數組的時候,如int array[5] = {1,2,3,4,5};我們實際上是聲明瞭一個int *[]的數組引用。所以我們可以對該數組直接解引用(*array)。

所以:int *a = array; 是成立的。

 

可以在上面的示例中,C ++使用數組語法([])將參數隱式轉換爲指針語法(*)。這意味着以下兩個函數聲明是相同的

1

2

void printSize(int array[]);

void printSize(int *array);

們一些程序員更喜歡使用[]語法,因爲它清楚地表明函數期望的是一個數組,而不僅僅是一個指向值的指針。但是,在大多數情況下,因爲指針不知道數組的大小,無論如何你需要傳入數組大小作爲單獨的參數(字符串是一個異常,因爲它們是空的)。因爲我們也不知道我們傳入指針地址的到底是個什麼東西。

重:C ++語言允許您對指針執行整數加法或減法操作。如果ptr指向一個整數,ptr + 1則是ptr之後內存中下一個整數的地址 ptr - 1ptr之前的前一個整數的地址。請注意,ptr + 1不會在ptr後返回內存地址,而會返回ptr指向的下一個對象的內存地址。

 

將固定數組的指針加上要查的下標值將會得出第X值的指針。然後解指針得到值。

 

 

new,new一個對象即是分配一塊動態內存。int *ptr = new int;

Deletedelete即是取消對一塊內存的分配,將其返還給操作系統,以供操作系統重新分配delete ptr;

 

處理動態內存分配時,空指針(指向地址0或空指針的指針)特別有用。在動態內存分配的情況下,空指針基本上說沒有內存已經分配給這個指針。這使我們可以做有條件地分配內存的事情:

1

2

3

// If ptr isn't already allocated, allocate it

if (!ptr)

    ptr = new int;

刪除空指針不起作用。因此,不需要以下內容:

1

2

if (ptr)

    delete ptr;

相反,你可以寫:

1

delete ptr;

如果ptr非空,則動態分配的變量將被刪除。如果它是空的,什麼都不會發生。

 

內存泄漏:運算符newdelete允許我們爲程序動態分配單個變量。

動態分配的內存沒有範圍,並將保持分配狀態,直到您取消分配或程序終止。

小心不要取消引用懸空或空指針。

 

所謂動態數組,只是在你創建數組之前,可以分配一個數字,而不是在你已經創建好了數組之後可以動態的改變數組的長度,可以動態改變長度的是vector。數組不能動態的改變數組。

int length;

    int *array = new int[length];  // 創建一個數組

     array[0] = 5; 

delete[] array; // 刪除數組的內存空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章