# C數組
C 語言支持**數組**數據結構,它可以存儲一個固定大小的相同類型元素的順序集合。數組是用來存儲一系列數據,但它往往被認為是一系列相同類型的變量。
數組的聲明并不是聲明一個個單獨的變量,比如 number0、number1、...、number99,而是聲明一個數組變量,比如 numbers,然后使用 numbers\[0\]、numbers\[1\]、...、numbers\[99\] 來代表一個個單獨的變量。數組中的特定元素可以通過索引訪問。
所有的數組都是由連續的內存位置組成。最低的地址對應第一個元素,最高的地址對應最后一個元素。

## 聲明數組
在 C 中要聲明一個數組,需要指定元素的類型和元素的數量,如下所示:
~~~
type arrayName [ arraySize ];
~~~
這叫做一維數組。**arraySize**必須是一個大于零的整數常量,**type**可以是任意有效的 C 數據類型。例如,要聲明一個類型為 double 的包含 10 個元素的數組**balance**,聲明語句如下:
~~~
double balance[10];
~~~
現在*balance*是一個可用的數組,可以容納 10 個類型為 double 的數字。
## 初始化數組
在 C 中,您可以逐個初始化數組,也可以使用一個初始化語句,如下所示:
~~~
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
~~~
大括號 { } 之間的值的數目不能大于我們在數組聲明時在方括號 \[ \] 中指定的元素數目。
如果您省略掉了數組的大小,數組的大小則為初始化時元素的個數。因此,如果:
~~~
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
~~~
您將創建一個數組,它與前一個實例中所創建的數組是完全相同的。下面是一個為數組中某個元素賦值的實例:
~~~
balance[4] = 50.0;
~~~
上述的語句把數組中第五個元素的值賦為 50.0。所有的數組都是以 0 作為它們第一個元素的索引,也被稱為基索引,數組的最后一個索引是數組的總大小減去 1。以下是上面所討論的數組的的圖形表示:

## 訪問數組元素
數組元素可以通過數組名稱加索引進行訪問。元素的索引是放在方括號內,跟在數組名稱的后邊。例如:
~~~
double salary = balance[9];
~~~
上面的語句將把數組中第 10 個元素的值賦給 salary 變量。下面的實例使用了上述的三個概念,即,聲明數組、數組賦值、訪問數組:
## 實例
```
#include <stdio.h>
int main ()
{
int n[ 10 ]; /* n 是一個包含 10 個整數的數組 */
int i,j;
/* 初始化數組元素 */
for ( i = 0; i < 10; i++ )
{
n[ i ] = i + 100; /* 設置元素 i 為 i + 100 */
}
/* 輸出數組中每個元素的值 */
for (j = 0; j < 10; j++ )
{
printf("Element[%d] = %d\n", j, n[j] );
}
return 0;
}
```
當上面的代碼被編譯和執行時,它會產生下列結果:
~~~
Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
~~~
數組練習:
1 將數組A中的內容和數組B中的內容進行交換。(數組長度相同)
2 計算一個數組中數字的最大值最小值及其所在的位置
3 有一個有序的數組,用戶輸入一個數字k,將k插入數組。要求插入后數組依然有序
4 用數組保存 Fibonacci 數列的前20項,以5個數為一行的形式輸出
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597
5 數組中存儲學生成績,計算該班級最高分,最低分,平均分,及格人數(60分以上)
成績用戶輸入 當用戶輸入-1 表示輸入結束
6 用戶輸入5個數,將其反序輸出
7 用戶輸入5個數,將其翻轉后輸出
8 用戶輸入一串字符,統計單詞的數量
# 冒泡排序法
在實際開發中,有很多場景需要我們將數組元素按照從大到小(或者從小到大)的順序排列,這樣在查閱數據時會更加直觀,例如:
* 一個保存了班級學號的數組,排序后更容易分區好學生和壞學生;
* 一個保存了商品單價的數組,排序后更容易看出它們的性價比。
對數組元素進行排序的方法有很多種,比如冒泡排序、歸并排序、選擇排序、插入排序、快速排序等,其中最經典最需要掌握的是「冒泡排序」。
以從小到大排序為例,冒泡排序的整體思想是這樣的:
* 從數組頭部開始,不斷比較相鄰的兩個元素的大小,讓較大的元素逐漸往后移動(交換兩個元素的值),直到數組的末尾。經過第一輪的比較,就可以找到最大的元素,并將它移動到最后一個位置。
* 第一輪結束后,繼續第二輪。仍然從數組頭部開始比較,讓較大的元素逐漸往后移動,直到數組的倒數第二個元素為止。經過第二輪的比較,就可以找到次大的元素,并將它放到倒數第二個位置。
* 以此類推,進行 n-1(n 為數組長度)輪“冒泡”后,就可以將所有的元素都排列好。
整個排序過程就好像氣泡不斷從水里冒出來,最大的先出來,次大的第二出來,最小的最后出來,所以將這種排序方式稱為
下面我們以“3? 2? 4? 1”為例對冒泡排序進行說明。
第一輪? 排序過程
3? 2? 4? 1??? (最初)
2? 3? 4? 1? ? (比較3和2,交換)
2? 3? 4? 1??? (比較3和4,不交換)
2? 3? 1? 4??? (比較4和1,交換)
第一輪結束,最大的數字 4 已經在最后面,因此第二輪排序只需要對前面三個數進行比較。
第二輪? 排序過程
2? 3? 1? 4 (第一輪排序結果)
2? 3? 1? 4 (比較2和3,不交換)
2? 1? 3? 4 (比較3和1,交換)
第二輪結束,次大的數字 3 已經排在倒數第二個位置,所以第三輪只需要比較前兩個元素。
第三輪? 排序過程
2? 1? 3? 4? (第二輪排序結果)
1? 2? 3? 4? (比較2和1,交換)
至此,排序結束。
## 算法總結及實現
對擁有 n 個元素的數組 R\[n\] 進行 n-1 輪比較。
第一輪,逐個比較 (R\[1\], R\[2\]),? (R\[2\], R\[3\]),? (R\[3\], R\[4\]),? …….? (R\[N-1\], R\[N\]),最大的元素被移動到 R\[n\] 上。
第二輪,逐個比較 (R\[1\], R\[2\]),? (R\[2\], R\[3\]),? (R\[3\], R\[4\]),? …….? (R\[N-2\], R\[N-1\]),次大的元素被移動到 R\[n-1\] 上。
。。。。。。
以此類推,直到整個數組從小到大排序。
具體的代碼實現如下所示:
```
~~~
#include <stdio.h>
int main(){
int nums[10] = {4, 5, 2, 10, 7, 1, 8, 3, 6, 9};
int i, j, temp;
//冒泡排序算法:進行 n-1 輪比較
for(i=0; i<10-1; i++){
//每一輪比較前 n-1-i 個,也就是說,已經排序好的最后 i 個不用比較
for(j=0; j<10-1-i; j++){
if(nums[j] > nums[j+1]){
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
//輸出排序后的數組
for(i=0; i<10; i++){
printf("%d ", nums[i]);
}
printf("\n");
return 0;
}
~~~
運行結果:
1 2 3 4 5 6 7 8 9 10
```
- 空白目錄
- 第一章 c語言簡介
- 1 通俗地理解什么是編程語言
- 2 C語言究竟是一門怎樣的語言
- 第二章 算法簡介&基本語法
- 1 算法簡介
- 2 C 程序結構
- 3 C 基本語法
- 第三章 數據類型
- 1 數據類型
- 2 變量
- 3 常量
- 第四章 運算符
- 1 算術運算符
- 2 關系運算符
- 3 邏輯運算符
- 4 位運算符
- 5 賦值運算符
- 6 雜項運算符(其他運算符)
- 7 c語言中的運算符優先級
- 第五章 控制流
- 1 判斷語句
- 2 switch語句
- 3 循環語句
- 4 流程控制相關案例
- 第六章 指針
- 1 c語言指針概述
- 2 指針的算術運算
- 3 指針數組
- 4 指向指針的指針
- 5 傳遞指針給函數
- 6 從函數返回指針
- 第七章 函數
- 1 函數的語法
- 2 作用域規則
- 3 形參與實參
- 第八章 數組
- 1 C語言中的數組
- 2 多維數組
- 3 傳遞數組給函數
- 4 從函數返回數組
- 第九章 指針
- 1 分鐘徹底理解C語言指針的概念
- 2 C語言指針變量的定義和使用
- 3 C語言指針變量的運算(加法、減法和比較運算)
- 4 C語言數組指針(指向數組的指針)
- 5 C語言字符串指針(指向字符串的指針)
- 第十章 結構體
- 第十一章 練習
- 第十二章 文件操作
- 第十三章 文件操作2