學習網站:http://www.learncpp.com/
圖片總是不能一直複製粘貼。還好有云文檔。
數組中的第一個元素是testScore [0]。即下標從零開始。對於長度爲N的數組,數組元素從0到N-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 }; // 初始化器列表初始化五個數字,而不用一個一個初始化。
如果初始化列表的長度小於其數組的長度,未被初始化的其餘元素將被初始化爲0。int 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分別隱式的代表0,1,2,3這四個數字。
可以將枚舉中的元素顯式的轉換爲一個整數,使用static_cast<int>(num::a) 可以將num::a顯示的轉化爲0。
重:在C++中,傳遞普通變量是傳遞其副本,而當傳遞一個數組時是傳遞其實際數組。當操作傳遞過來的普通變量時,原變量不會改變。而操作傳遞過來的數組時,原數組也會相應的被修改。
Std::swap(x,y)函數用於交換兩個數。
std::swap(x, y); // 交換x和y的值。
我們回憶一下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 - 1是ptr之前的前一個整數的地址。請注意,ptr + 1不會在ptr後返回內存地址,而會返回ptr指向的下一個對象的內存地址。
將固定數組的指針加上要查的下標值將會得出第X值的指針。然後解指針得到值。
new,new一個對象即是分配一塊動態內存。int *ptr = new int;
Delete,delete即是取消對一塊內存的分配,將其返還給操作系統,以供操作系統重新分配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非空,則動態分配的變量將被刪除。如果它是空的,什麼都不會發生。
內存泄漏:運算符new和delete允許我們爲程序動態分配單個變量。
動態分配的內存沒有範圍,並將保持分配狀態,直到您取消分配或程序終止。
小心不要取消引用懸空或空指針。
所謂動態數組,只是在你創建數組之前,可以分配一個數字,而不是在你已經創建好了數組之後可以動態的改變數組的長度,可以動態改變長度的是vector。數組不能動態的改變數組。
int length;
int *array = new int[length]; // 創建一個數組
array[0] = 5;
delete[] array; // 刪除數組的內存空間