文章目錄
- 前言
- 1、陣列是什么
- 2、一維陣列
- 2.1一維陣列的創建
- 2.2一維陣列的初始化
- 2.3一維陣列的使用
- 2.4一維陣列在記憶體中的存盤
- 3、二維陣列
- 3.1二維陣列的創建
- 3.2二維陣列的初始化
- 3.3 二維陣列的使用
- 3.4 二維陣列在記憶體中的存盤
- 4、陣列越界
- 5、陣列名的探討
- 最后
前言
陣列的作用在程式編程中的重要性不言而喻,它是指相同型別元素的一組集合,
比如油煙機的風扇轉速會和作業的模式之間有一定的關系,那么我們就可以把它的作業模式和一維陣列的下標對應起來,我們將具體的轉速放在陣列中,這樣的話就非常方便我們在日后查詢,
在程式中合理地使用陣列,會使程式的結構比較整齊,而且可以把較為復雜的運算,轉化成簡單的陣列來表示,
提示:以下是本篇文章正文內容,
1、陣列是什么
陣列是一組相同型別元素的集合,
我們在C語言中有各種型別的元素,比如說int型別,float型別,double型別,long型別,當我們的元素型別是相同的時候,我們就可以把它們放在同一個集合里面,這個集合我們就稱為陣列,
陣列我們又分為一維陣列、二維陣列和多維陣列,下面開始為大家介紹一維陣列和二維陣列,
2、一維陣列
2.1一維陣列的創建
【創建形式】
type arr_name [const];
//type是指陣列的元素型別
//arr_name是指陣列的名字
//const是一個常量運算式,用來指定陣列的大小
陣列創建, [ ] 中要給一個常量才可以,不能使用變數,
【陣列創建實體】
//代碼1
int arr1[10];//整型陣列
//代碼2
int count = 10;
int arr2[count];
//這種寫法是錯誤的,因為陣列里面只能放常量,也就是說它必須含有一個常量值
//代碼3
char arr3[10];//字符陣列
float arr4[1];//單精度陣列
double arr5[20];//雙精度陣列
}
陣列創建之后,我們需要初始化,那么怎么進行初始化呢?下面我們就來講講這個問題,
2.2一維陣列的初始化
一維陣列初始化就是給一維陣列賦初值,作用就是申明的這個一維陣列有了一個確定的值,從而可以得到具體應用,
一個陣列申明后,如果沒有賦值,那么只是分配了記憶體空間,沒有具體的值,也可以說是空,其組成是“\0”也就是NULL,無法在實際中使用,
簡單來說,陣列的初始化是指,在創建陣列的同時給陣列的內容一些合理初始值(初始化),
【陣列初始化實體】
int arr[5];//全域變數未初始化,默認是0
int main()
{
int arr6[5];//區域變數未初始化,默認值未隨機值
int arr1[20] = {1,2,3,4};//不完全初始化,剩余的默認初始化為0
int arr2[] = { 1, 2, 3 };
char arr3[] = "abc";//a,b,c,\0——有四個元素
char arr4[] = { 'a', 'b', 'c' };//a,b,c——只有三個元素
char arr5[] = { 'a', 98, 'c' };
printf("%d\n", arr1[0]);
return 0;
}
在這里,我們可以打開vs2013編譯器的監視視窗看看陣列的值,
1、陣列arr1[20]

【注意】
陣列在創建的時候如果想不指定陣列的確定的大小就得初始化,陣列的元素個數根據初始化的內容來確定,
如上面代碼中的陣列char arr3[]; char arr4[]; char arr5[];
2.3一維陣列的使用
1、對于陣列的使用我們之前介紹了一個運算子: [ ] ,下標參考運算子,它其實就陣列訪問的運算子,
2、陣列是使用下標來訪問元素的,陣列中第一個元素的下標為0,
3、陣列的大小是可以計算的,用sizeof運算子計算,下面實體有講,
【實體分析】
int main()
{
float sc[5] = {0.0f,3.0f };//結構體陣列也可以創建
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//創建陣列并初始化
int i = 0;
//計算陣列元素個數
int sz = sizeof(arr) / sizeof(arr[0]);//sizeof(arr)表示整個陣列大小,sizeof(arr[0])表示一個元素大小
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);// 陣列是使用下標來訪問元素的
}
return 0;
}


【總結】
- 陣列是使用下標來訪問的,下標是從0開始,
- 陣列的大小可以通過計算得到,
2.4一維陣列在記憶體中的存盤
陣列在記憶體中是連續存放的
【實體分析】
int main()
{
int arr[10] = { 0 };//創建并初始化陣列
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//計算陣列大小
for (i = 0; i<sz; ++i)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
//陣列地址用%p列印,將陣列地址逐個列印出來
}
return 0;
}
為什么會相差4?
因為我們定義的是一個整型陣列,而一個整型元素是4個位元組,所以陣列地址列印出來相差4,
【總結】
隨著陣列下標的增長,元素的地址,有規律的遞增, 陣列在記憶體的存放是由低地址到高地址連續存放的,
3、二維陣列
3.1二維陣列的創建
【創建形式】
type arr_name [const1][const2];
//type是指陣列的元素型別
//arr_name是指陣列的名字
//const1、const2是一個常量運算式,用來指定陣列的大小,表示有幾行幾列
【創建實體】
//陣列創建
int arr1[1][2];//表示有1行2列
char arr2[3][4];//表示有3行4列
double arr3[5][6];//表示有5行6列
3.2二維陣列的初始化
二維陣列的初始化跟一維陣列大同小異
int main()
{
int arr1[3][5] = {1,2,3,4,5,6,7,8,9,10,11};
//三行五列,把一行放滿之后再放第二行,依次類推,沒得放之后,默認為0
int arr2[3][5] = { { 1, 2 }, { 3, 4 }, {5,6} };
//每一行都看成一個一維陣列,可以除錯出來
int arr3[][5] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
//二維陣列的列不能省略,行可以省略,基于初始化的前提,不初始化不能省略
char ch1[4][6] = {'a','b'};
char ch2[4][6] = { {' a' }, { 'b' } };
char ch3[4][6] = { "abc","def","qwe" };//四行六列
double d[4][7];
return 0;
}
【分析】
陣列arr1


【注意】
1、二維陣列,放多少行沒有所謂,因為默認是往前遞增,但是省略列的話,就不知道一行放多少個元素了
2、可以認為二維陣列有多少個元素,每個元素就是一個一維陣列

3.3 二維陣列的使用
二維陣列的訪問也是通過下標的形式進行的

3.4 二維陣列在記憶體中的存盤
那么二維陣列在記憶體中的存盤是不是也是跟一維陣列一樣的呢?
我們來列印一下:
int main()
{
int arr[3][5] = { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8, 9, 0 } };
int i = 0;
for (i = 0; i < 3; i++)//0-2
{
int j = 0;
for (j = 0; j < 5; j++)//0-4
{
printf("&arr[%d][%d]= %p\n",i,j,&arr[i][j]);
}
}
return 0;
}
【總結】
二維陣列在記憶體中也是連續存盤的
4、陣列越界
前提: 陣列的下標是有范圍限制的,
1、陣列的下規定是從0開始的,如果輸入有n個元素,最后一個元素的下標就是n-1,
2、陣列的下標如果小于0,或者大于n-1,就是陣列越界訪問了,超出了陣列合法空間的訪問,
3、C語言本身是不做陣列下標的越界檢查,編譯器也不一定報錯,但是編譯器不報錯,并不意味著程式就是正確的,所以程式員寫代碼時,最好自己做越界的檢查
【實體分析】
比如陣列定義時有十個元素,那么a[0] – a[9] 分別對應相應的元素,在程式中如果使用了a[10]那么就超出了原來的陣列定義的范圍,這就是陣列下標越界,

【注意】
這里編譯并沒有報錯,但是程式確實錯的,所以在定義陣列的時候,我們要千萬小心,二維陣列的行和列也可能存在越界,
5、陣列名的探討
一般來說陣列名是首元素的地址 有兩個例外
1、sizeof(陣列名),這里的陣列名表示整個陣列,sizeof(陣列名),計算的是整個陣列的大小
2、&陣列名,這里的陣列名表示整個陣列,取出的是陣列的地址
【實體分析】
int main()
{
int arr[10] = { 1, 2, 3, 4, 5 };
printf("%p\n", arr);
printf("%p\n", &arr[0]);
printf("%p\n", &arr);
//數值一樣,但意義不同,前兩個是首元素地址,第三個是陣列的地址,雖然看起來值一樣,意義不同
printf("---------------");
printf("%p\n", arr+1);
printf("%p\n", &arr[0]+1);
printf("%p\n", &arr+1);
//前兩個值依舊一樣,但最后一個跟前兩個差了40,因為陣列是個元素,一個元素是一個整型,10個就是40個位元組
//最后一個,跳過整個陣列,前兩個跳過一個元素
//陣列的地址,影響的是整個陣列,陣列首元素的地址影響的是陣列的元素
return 0;
}

1、前兩個值依舊一樣,但最后一個跟前兩個差了40,因為陣列是個元素,一個元素是一個整型,10個就是40個位元組
2、最后一個,跳過整個陣列,前兩個跳過一個元素
3、陣列的地址,影響的是整個陣列,陣列首元素的地址影響的是陣列的元素
最后
以上內容是通過本人學習的理解和網上資料的整理梳理出來的陣列的一些內容,有錯漏之處,還請各位多多包涵與指出,共同進步,共同成長!轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/299728.html
標籤:其他
上一篇:計算機系統(一)——馮諾依曼體系
