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 ...