數組顧名思義就是一堆數據組成的
- 把具有相同數據類型的若干變量按有序的形式組織起來,
以便于程序處理,這些數據元素的集合就是數組,按照數組元素的類型不同,可分為:數值數組、字符數組、指針數組 - 數組的應用場景就是用來保存多個數據類型相同的變量
數組的優點:數組是將元素在內存中連續存儲的;
因為數據是連續存儲的,內存地址連續,所以在查找數據的時候效 率比較高;
缺點:在存儲之前,我們需要申請一塊連續的內存空間,并且在編譯的時候就必須確定好它的空間的大小。在運行的時候空間的大小是無法隨著你的需要進行增加和減少而改變的,當數據兩比較大的時候,有可能會出現越界的情況,數據比較小的時候,又有可能會浪費掉內存空間。在改變數據個數時,增加、插入、刪除數據效率比較低
- 數組的定義 ==> 數據類型 數組名稱 元素個數 例如:int arr[5];
上面的意思是申請了一個整形類型的數組里面可以存放五個元素
數組的定義和初始化幾種樣子
- int arr[3] = {4, 6, 9}; 指定元素個數,完全初始化
- int arr[] = {4, 6, 9}; 不指定元素個數,完全初始化
- int arr[5] = {1,2}; 指定元素個數,部分初始化
- int arr[5] = {[4] = 3,[1] = 2}; 指定元素個數,部分初始化
- int arr[] = {[4] = 3}; 不指定元素個數,部分初始化
- int arr[3];先定義后初始化
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
如果定義了數組,但沒有給數組內的元素賦值,那么數組中沒有賦值的元素將存儲的回事垃圾數據
數組的注意點:
使用數組時不能超出數組的索引范圍使用, 索引從0開始, 到元素個數-1結束
使用數組時不要隨意使用未初始化的元素, 有可能是一個隨機值
對于數組來說, 只能在定義的同時初始化多個值, 不能先定義再初始化多個值
數組的調用
- int arr[5] = {5,2,3,1,6};這五個數的索引分別是01234;
假如我想要拿出元素2那么就 arr[1] 拿出元素6就是 arr[4] - 數組的遍歷
int ages[4] = {19, 22, 33, 13};
for (int i = 0; i < 4; i++) { printf("ages[%i] = %i\n", i, ages[i]); }
計算數組的總長度:sizeof(數組名稱)
這是計算一個數組的總占量
sizeof(數組名稱[0])
計算數組里面單個元素占用的量
總占用量除以單個占用量就是這個數組的長度
正序輸出數組
數組在內存中的存儲與分配空間
- 1.內存尋址中,從高到低分配一塊連續沒有被使用的內存給數組
- 2.從分配的連續存儲空間中, 從地址小的位置開始給每個元素分配空間
- 3.從每個元素分配的存儲空間中, 地址最大的位置開始存儲數據
- 4.數組名指向的是內存地址最小的那塊空間
-
字符在內存中是以對應ASCII碼值的二進制形式存儲的,而非上述的形式。
數組的越界問題
數組越界導致的問題:
約錯對象
程序崩潰
數組可以作為函數的參數使用,數組用作函數參數有兩種形式:
一種是把數組元素作為實參使用
一種是把數組名作為函數的形參和實參使用
在C語言中,數組名除作為變量的標識符之外,數組名還代表了該數組在內存中的起始地址,因此,當數組名作函數參數時,實參與形參之間不是"值傳遞",而是"地址傳遞"
實參數組名將該數組的起始地址傳遞給形參數組,兩個數組共享一段內存單元, 系統不再為形參數組分配存儲單元
既然兩個數組共享一段內存單元, 所以形參數組修改時,實參數組也同時被修改了
數組名作函數參數的注意點
- 在函數形參表中,允許不給出形參數組的長度
- 形參數組和實參數組的類型必須一致,否則將引起錯誤。
- 當數組名作為函數參數時, 因為自動轉換為了指針類型,所以在函數中無法動態計算除數組的元素個數