1. 程式人生 > >C++重點知識總結----陣列

C++重點知識總結----陣列

記憶體分割槽
堆:手動分配釋放,malloc,new來分配,free,delete來釋放
棧:編譯器自動分配釋放,存放函式的引數值、區域性變數的值等
全域性(靜態)儲存區:存放全域性變數和靜態變數,包括DATA段(全域性初始化區,存放初始化的全部變數和靜態變數)與BSS段(全域性未初始化區,在程式執行之前BSS段會自動清0),程式結束後由系統釋放
文字常量區:常量字串,程式結束後由系統釋放
程式程式碼區:存放函式體的二進位制程式碼

陣列:
一維陣列:
1、一維陣列宣告:值的型別(不能使引用)、陣列名和元素數(用值大於1的常量表達式定義)

int& a[10
];//錯誤,沒有引用陣列 int a[6] = { 0,1,2,3,4,5 }; int (&p)[6] = a;//p是陣列a的引用

2、陣列元素初始化時,若沒有顯式提供元素初值,則元素會被像普通變數一樣初始化:
1)函式體外定義的內建型別陣列,元素初始化為0;
2)函式體內定義的內建型別陣列,元素無初始化(若只初始化部分元素,其後的元素此時也會被初始化為0);
3)如果不是內建型別,則不管其在哪定義,自動呼叫其預設建構函式為其初始化,若該類無預設建構函式則會報錯。

3、陣列大小未知時,需要動態宣告一維陣列:

int* a = new int[2];
delete[]a;//陣列使用完畢時要釋放記憶體空間

4、C風格字串:末尾必須有一個字元’\0’
1)字串常量,以雙引號括起,編譯器自動在末尾新增一個空字元
2)末尾添加了’\0’的字元陣列

5、字元陣列:既可以用一組由括號括起來、逗號隔開的字元常量進行初始化,也可以用一個常量字串(末尾有空字元)進行初始化
注意:在使用處理C風格字串的標準庫函式時,牢記引數必須以結束符NULL結束;

二維陣列:
6、C++規定,在宣告和初始化一個二維陣列時,如果對二維陣列的所有元素都賦值,則第一維(行數)可以省略;

7、在C/C++中,二維陣列按照行優先順序連續儲存,即先將第一行按順序儲存,再對第二行順序儲存;

8、一個二維陣列元素a[x][y]在一維陣列b中,是a[x][y]=b[x*列數+y];

9、二維陣列的動態宣告:
產生一個二維陣列a[m][n]

int m = 5,n=3;
int **a = new int* [m];
for (int i = 0; i < m; i++)
{
    a[i] = new int [n];
}

只能用a[i][j]或者((a+i)+j)來訪問陣列的元素;
動態宣告的陣列,使用後需要釋放記憶體:

for (i= 0; i < m; ++i)
{
    delete []a[i];
}
delete []a;

陣列指標和指標陣列陣列名的指標操作
10、指標加上一個整數的結果是另一個指標,當一個指標和一個整數量進行算術運算時,這個整數量會根據指標的型別進行適當調整(3+float型的指標,結果是+3*4(4是float型別的大小))

11、C的指標的算術運算
1)指標+/-整數,用於指向陣列中某個元素的指標,對一個指標加1使它指向陣列中的下一個元素
2)指標-指標,只有當兩個指標都指向同一個陣列中的元素時,才允許從一個指標減去另一個指標,減去運算的值是兩個指標在記憶體中的距離(無視陣列型別,相隔幾個元素即為幾)

12、指標陣列:元素為指標的陣列
陣列指標:一個指向陣列的指標

int *a[10];//指標陣列
int(*p)[10];//陣列指標

二維陣列的陣列名是一個數組指標

13、在表示式中使用陣列名時,該名字會自動轉換為指向陣列首元素的指標

14、陣列的首地址是常量,不可以進行賦值操作

15、當陣列作為函式實參傳遞時,傳遞給函式的陣列首元素的地址,而將陣列某一個元素的地址當作實參時,傳遞的是此元素的地址,也就是子陣列(以此元素作為首元素的子陣列)首元素的地址;

16、

int a[4][5];
&a; //int(*)[4][5]
a + i; //int(*)[5]
*(a + i); //int*
*(*(a + i) + j); //int
*(a + i) = a[i]; 
*(*(a + i) + j) = *(a[i] + j) = a[i][j];

17、順序表可以進行隨機存取,插入演算法、按值查詢演算法和刪除演算法的平均時間複雜度都為O(n),按地址、序號查詢演算法的平均時間複雜度為O(1)

18、cout輸出時遇到’\0’時就不再輸出