1. 一維數組的創建和初始化
數組的創建
???????數組是一組相同類型元素的集合。 數組的創建方式:
type_t arr_name [const_n];
//type_t 是指數組的元素類型
//const_n是一個常量表達式,用來指定數組的大小
數組創建的實例:
//代碼1int arr1[10];
//代碼2int count = 10;int arr2[count];//數組時候可以正常創建?=》在 C99 及之后的標準中,代碼是合法的。在 C89/C90 標準中,count 必須是一個常量表達式,可以使用 #define 或 const 來定義常量。
//代碼3char arr3[10];float arr4[1];double arr5[20];
注:數組創建,[] 中要給一個常量才可以,不能使用變量。
數組的初始化
???????數組的初始化是指,在創建數組的同時給數組的內容一些合理初始值(初始化)。 看代碼:
int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";
???????數組在創建的時候如果想不指定數組的確定的大小就得初始化。數組的元素個數根據初始化的內容來確定。 但是對于下面的代碼要區分,內存中如何分配。
char arr1[] = "abc";
char arr2[3] = {'a','b','c'};
2. 一維數組的使用
???????對于數組的使用我們之前介紹了一個操作符:[] ,下標引用操作符。它其實就數組訪問的操作符。 我們來看代碼:
#include <stdio.h>int main(){int arr[10] = {0};//數組的不完全初始化//計算數組的元素個數int sz = sizeof(arr)/sizeof(arr[0]);//對數組內容賦值,數組是使用下標來訪問的,下標從0開始。所以:int i = 0;//做下標for(i = 0; i < 10; i++)//這里寫10,好不好?{arr[i] = i;} //輸出數組的內容for(i = 0; i < 10; ++i){printf("%d ", arr[i]);}return 0;}
總結:
- 數組是使用下標來訪問的,下標是從0開始。
- 數組的大小可以通過計算得到。
int arr[10];int sz = sizeof(arr)/sizeof(arr[0]);
3. 一維數組在內存中的存儲
???????接下來我們探討數組在內存中的存儲。 看代碼:
#include <stdio.h>int main(){int arr[10] = {0};int i = 0;for(i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i){printf("&arr[%d] = %p\n", i, &arr[i]);}return 0;}
???????隨著數組下標的增長,元素的地址,也在有規律的遞增。 由此可以得出結論:數組在內存中是連續存放的。
4. 二維數組的創建和初始化
二維數組的創建:
//數組創建int arr[3][4];char arr[3][5];double arr[2][4];
//數組初始化int arr[3][4] = {1,2,3,4};//由于提供的元素數量少于 12(3*4),其他未初始化的元素會自動被初始化為 0int arr[3][4] = {{1,2},{4,5}};//3 行 4 列的二維數組 arr。初始化列表中的第一行由 {1, 2} 組成,第二行由 {4, 5} 組成int arr[][4] = {{2,3},{4,5}};//
5. 二維數組的使用
二維數組的使用也是通過下標的方式。 看代碼:
#include <stdio.h>
int main()
{int arr[3][4] = {0};int i = 0;for(i=0; i<3; i++){int j = 0;for(j=0; j<4; j++){arr[i][j] = i*4+j;}}for(i=0; i<3; i++){int j = 0;for(j=0; j<4; j++){printf("%d ", arr[i][j]);}}return 0;
}
6. 二維數組在內存中的存儲
像一維數組一樣,這里我們嘗試打印二維數組的每個元素.
#include <stdio.h>int main(){int arr[3][4];int i = 0;for(i=0; i<3; i++){int j = 0;for(j=0; j<4; j++){printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);}}return 0;}
結果表明,二維數組在內存中也是連續存儲的。
7 數組作為函數參數
???????
往往我們在寫代碼的時候,會將數組作為參數傳個函數,比如:我要實現一個冒泡排序(這里要講算法思想)函數將一個整形數組排序。 那我們將會這樣使用該函數:
案例:
#include <stdio.h>
int main()
{int arr[] = {3,1,7,5,8,9,0,2,4,6};bubble_sort(arr);for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++){printf("%d ", arr[i]);}return 0;
}
void bubble_sort(int arr[])
{int sz = sizeof(arr)/sizeof(arr[0]);//這樣對嗎?...
}
如果錯了,該怎么設計?
bubble_sort(arr, sz); //使用的時候,傳數組元素個數
void bubble_sort(int arr[], int sz)//參數接收數組元素個數
{//...}
???????數組作為函數參數的時候,不會把整個數組的傳遞過去。
???????實際上只是把數組的首元素的地址傳遞過去了。所以即使在函數參數部分寫成數組的形式:
然是一個指針:int *arr 。
???????結論:
???????數組傳參,如果函數內部需要知道數組元素個數應該在函數外部算出元素個數,以參數的形式傳遞給函數。