天天看點

【c++知識點】數組

【概念】

1、數組中的獨立變量:索引變量,下标變量或元素

2、方括号中的數字:索引或下标

3、數組的索引變量數目:聲明長度或數組長度

4、索引編号從0開始,結束于數組長度-1的整數

5、索引變量可以為任意類型,但同一數組的所有索引變量必然是同一類型(基類型)

6、方括号中的索引可以是整數常量,如int a[10];也可以是表達式(求值結果在0和數組長度-1之間),如int n=2;score[n+1]=10;

【聲明】

聲明數組時,數組長度可以使用已定義的常量

const int NUM=10;int score[NUM];//注意:數組長度不能使用變量!!部分編譯器不相容

【記憶體表示】

1、數組各索引變量的位置在記憶體中相鄰;

2、計算機僅記住索引變量a[0]的位址,通過元素的基類型占用的記憶體空間來計算其他索引變量的位址。

3、常見錯誤是引用不存在的數組索引,導緻記憶體溢出;

【初始化】

int num[3]={4,21,55};//提供的值少于數組長度,剩餘索引變量預設初始化為數組基類型的零值(建議主動初始化)。

【周遊】

int arr[]={3,5,9,14};

for(int x:arr){

 cout<<x<<endl;

}

for(auto x:arr){

 cout<<x<<endl;

}

【函數參數】

1、索引變量作為函數參數時,用法和普通變量一樣;

2、整個數組作為函數參數時,需在形參中指明數組長度(隻有數組首個索引變量的位址和基類型被傳遞),此時數組實參自動退化為同類型指針。

int getSize(int data[],int size);//size為數組長度,data[5]内的索引數字會被編譯器忽略

//以下為數組退化為指針示範

int getSize(int data[]){return sizeof(data);}

int data[] = {1,2,3,4,5};

cout<<sizeof(data)<<endl;//輸出20

cout<<getSize(data)<<endl;//輸出8,64位系統下指針長度為8位元組

注意:

1、實際調用函數時,提供的實參data不添加[]或索引表達式,如getSize(data,5);

2、數組形參為傳引用參數的弱型,作用于數組形參的任何操作都會作用于數組實參

3、常量數組參數用const修飾(通常隻修飾數組形參和類形參),數組任何值都不能被修改int getSize(const int data[],int size);

【常用算法】

1、順序搜尋

2、選擇排序

3、冒泡排序(較大值如同氣泡上浮,連續向數組末尾移動)

【二維數組】

二維數組可以轉換為對應的二維顯示,第一個索引代表行,第二個索引代表列。

int getSize(int data[][3],int size);

注意:

1、二維數組作為參數傳遞時,不指定第1維長度(索引數組被編譯器忽略),size用于辨別第1維長度

2、第1維(甚至更多元)是用于描述基類型,而基類型長度必須被指出!

【動态數組要點】

1、寫代碼時不指定數組長度,在運作時确定長度

2、數組變量本質是指針變量,指向數組的第一個索引變量

3、數組辨別符a可視為指針變量,且指針值不可修改!!

int a[5];int *p=addr;a=p;//非法!!

【動态數組聲明&銷毀】

int *p=new int[3];//通過new操作符建立

1、動态數組指針的指針類型和數組元素的指針類型是相同的

2、動态數組長度在[]中指出,如果缺失則由系統配置設定足夠大的存儲空間

3、delete []p;//銷毀動态數組所在的堆記憶體空間