C 基礎(02) 陣列

2021-09-25 07:25:00 字數 3897 閱讀 1635

1、陣列的特點

2、陣列作為函式的形參

(1)、陣列有兩個性質:不允許拷貝陣列,以及使用陣列時會將其轉換成指標。因為不能拷貝陣列,所以無法以值傳遞的方式使用陣列引數。因為陣列會被轉換成指標,所以當為函式傳遞乙個陣列時,實際上傳遞的是指向陣列首元素的指標。

(2)、陣列的引用

// arr是乙個整型陣列的引用,該陣列具有10個整數

void f1(int (&arr)[10]);

(3)、指標和陣列

// 10個指標構成的陣列,陣列的元素型別是指標:int *

int *arr1[10];

// 指向含有10個整數的陣列的指標。

int (*arr2)[10];

3、一維陣列(1)、一維陣列定義方式(如下三種):

// 資料型別  陣列名 [ 陣列長度 ]

int a[10];

// 利用 new 來建立乙個有10個元素的陣列,返回的是指向該陣列首位址的指標

int *b=new int[10] ;

// 用常量來指定陣列的大小

int num1;

constexpr int num2;

int a[num1]; //錯誤,因為 num1 不是常量

int a[num2]; //正確,因為 num2 是常量

// 資料型別 陣列名 [ 陣列長度 ] = ;

int b[3] = ;

// 資料型別 陣列名 = ;

int c = ;

//內建陣列不支援拷貝或賦值

int e[5]=;

int f[5]=e; //錯誤,內建的陣列不能進行拷貝,因為e只是表示陣列的首元素位址

【注】陣列的維度必須是乙個常量表示式,在c++初始化陣列時,陣列的長度必須是乙個常量,不能是變數(常變數除外)

int num1=10;

int arr1[num1]; // 錯誤,因為num為變數

const int num2=10;

int arr2[num2]; //正確

(2)、將一位陣列初始化為0的幾種方式:

int arr1[10]; // arr1預設是隨機值,在此為 -858993460

int arr2[10] = ;// arr2被初始化為0

int arr3[10];

memset(arr3, 0, sizeof(int) * 10); // arr3被初始化為0

(3)、一維陣列名的用途

// 獲取陣列的長度

auto p = begin(s1);//等效於: int *pbeg=&s1[0];

auto e = end(s1);

auto d=p-e; //結果為4

對應的型別如下圖所示

4、多維陣列

(1)、二維陣列定義(預設的元素用0來表示)

int a1[2][3];

int a2[2][3] = , };

int a3[2][3] = ;

int a4[3] = ;

(2)、使用範圍for來進行遍歷多維陣列時:除了最內層的迴圈外,其他的所有迴圈控制變數都應該是引用型別

#include#includeusing namespace std;

int main()

, };

for (auto &row : arr) // 除最內層外,其他的控制變數都要用引用的型別

cout << endl;

} cin.get();

}

因為:如果row不是引用型別,編譯器在初始化row時,會自動的將這些陣列形式的元素轉換成指向該陣列內首元素的指標。這樣row的型別就是int * ,這樣內層迴圈就不合法了。

1、將陣列作為函式的形參,可以用指標或陣列名的形式來進行傳遞實參

// 以指標的形式,arr為陣列的首位址,len為陣列元素的個數

void printarray(int *arr , int len)

// 陣列名的形式,看起來更直觀。len為陣列元素的個數

void printarray(int arr , int len)

2、關於陣列的長度求解。

(1)、如果在傳遞陣列的時候只傳遞陣列名,此時在接受的函式中用 sizeof 將無法求得陣列的元素個數。實驗示例如下:

#include#includeusing namespace std;

// 只傳遞陣列名,在呼叫函式中求陣列長度

void printarray01(int *arr)

cout << "\n---------------------\n";

}int main()

; cout << "printarray01列印結果為:\n";

printarray01(a);

system("pause");

}

執行結果如下:

所以在子函式中用 sizeof(arr) / sizeof(arr[0])  來求陣列的元素時結果為1,因為該函式只接受了陣列的第乙個元素的位址。

引數的傳遞是將實參的值賦給形參。然而對於陣列來說卻是乙個例外,因為陣列的資料太多了,將其一一賦值既麻煩又浪費空間。所以陣列作為引數傳遞給函式時,只傳遞了陣列首元素的位址,函式在需要用到後面元素時再按照這個位址和陣列下標去查詢。也就是說後面的元素根本沒到函式裡來,所以在函式裡求不出陣列的大小也就不足為奇了。
(2)、為解決以上的問題,需要在定義陣列的地方,預先用 sizeof(arr) / sizeof(arr[0])  來求得陣列的元素個數。再將求得的陣列元素個數和陣列名一起傳遞給函式。例項如下

#include#includeusing namespace std;

// 在定義陣列的地方求得陣列的元素個數,再作為實參傳遞過來

void printarray02(int* arr, int len)

cout << "\n--------------------\n";

}int main()

; int len = sizeof(a) / sizeof(a[0]); // 預先求得陣列元素的個數

cout << "printarray02列印結果為:\n";

printarray02(a, len);

system("pause");

}

執行結果如下

【注意】:c++11 引入陣列容器 array 。 該容器可以支援拷貝初始化的操作

java基礎點滴02 陣列

1.陣列在記憶體中的儲存 陣列儲存與記憶體中的堆中,並將自己陣列的首位址儲存在棧中的陣列名變數中。陣列的儲存形式與物件一致,即是按引用儲存而不是值儲存。見下圖 2.陣列的選擇排序a n 初步理解該演算法,其變化形式及演算法複雜度後面補習。理解 外層 從第乙個元素開始依次與後面所有元素比較,直到倒數第...

C 基礎入門02

在這一章中,我們將討論建立 c 程式設計所需的工具。我們已經提到 c 是 net 框架的一部分,且用於編寫 net 應用程式。因此,在討論執行 c 程式的可用工具之前,讓我們先了解一下 c 與 net 框架之間的關係。net 框架 net framework net 框架是乙個創新的平台,能幫您編寫...

C 入門基礎02

1 常量 const 資料型別 常量名稱 常量值 2 列舉 關鍵字 enum public enum 名稱 3 變數 修飾符 變數型別 變數名稱 4 結構 關鍵字 struct public struct 結構名稱 例 public enum gender public struct person ...