# 陣列
今天當你要宣告a,b,c的變數。沒有甚麼問題。
但今天如果要叫你宣告a,b,c,d,...z的變數或至少高達100個變數。
這樣不就會要花很多時間宣告變數?
所以我們就需要陣列來幫我們儲存資料。
## 陣列介紹:
### 如何宣告?
```
資料型態 陣列名稱[陣列大小]
```
舉例:
```c
int a[3];
float b[3];
long long int c[3];
char d[3];
```
也可以
```c
const int SIZE=100;
int a[SIZE];
float b[SIZE];
long long int c[SIZE];
char d[SIZE];
```
宣告變數和宣告陣列

:::warning
注意:
從上面的例子舉例:
陣列的索引值是從$0$開始到$2$,並不是從$1$開始到$3$,而且索引值絕對不能是負的,如果用到不存在的記憶體空間,就會出現不可預期的錯誤。
:::
代表說如果你要使用$a[100]$的值,你就需要宣告$a[101]$的陣列大小。
## 初始化
1.我想讓長度為五的a陣列裡面依序放1、2、3、4、5
```c
int a[5]={1,2,3,4,5};
```
| a[0] | a[1] | a[2] | a[3] | a[4] |
| ---- | ---- | ---- | ---- |:---- |
| 1 | 2 | 3 | 4 | 5 |
---
2.我想讓長度為五的b陣列裡面的數值全部為0
```c
int b[5]={0};
```
或
```c
int b[5]={};
```
| b[0] | b[1] | b[2] | b[3] | b[4] |
| ---- | ---- | ---- | ---- |:---- |
| 0 | 0 | 0 | 0 | 0 |
---
3.我想要初始化c陣列但我沒宣告陣列大小
```c
int c[]={1,2,3,4,5};
```
這樣宣告c陣列的大小就是五
| c[0] | c[1] | c[2] | c[3] | c[4] |
| ---- | ---- | ---- | ---- |:---- |
| 1 | 2 | 3 | 4 | 5 |
---
4.若要初始的數量比d陣列大小還小
```c
int d[5]={1,2,3}
```
後面就會自動補0
| d[0] | d[1] | d[2] | d[3] | d[4] |
| ---- | ---- | ---- | ---- |:---- |
| 1 | 2 | 3 | 0 | 0 |
---
5.如果都沒有初始化...
```c
int e[5];
```
| e[0] | e[1] | e[2] | e[3] | e[4] |
|:-------:|:-------:|:-------:|:---- |:-------:|
| 6422352 | 4200891 | 4200800 | 0 | 3362816 |
會跑出不可預期的數值,但如果宣告在main函式外就會幫你初始化為0。
---
## 賦值
1.我想要將a陣列中索引值為1的數值改成10
```c
int a[5]={0}
a[1]=10
```
| a[0] | a[1] | a[2] | a[3] | a[4] |
| ---- | ---- | ---- | ---- |:---- |
| 0 | 10 | 0 | 0 | 0 |
---
2.我想將a陣列中全部位置的值都改成2
```c
int b[5];
for(int i=0;i<5;i++){
b[i]=2;
}
```
| b[0] | b[1] | b[2] | b[3] | b[4] |
| ---- | ---- | ---- | ---- |:---- |
| 2 | 2 | 2 | 2 | 2 |
---
3.我想將多個輸入的值依序放進陣列中
```c
const int SIZE=5;
int c[SIZE];
for(int i=0;i<SIZE;i++){
scanf("%d",c[i]);
}
```
如果依序輸入2,1,3,5,4。
| c[0] | c[1] | c[2] | c[3] | c[4] |
| ---- | ---- | ---- | ---- |:---- |
| 2 | 1 | 3 | 5 | 4 |
補充:
這裡的陣列前不用加&,因為陣列名稱有指標的概念。
---
## 輸出
1.我想知道a陣列索引值1的值是甚麼?
```c
int a[5]={1,2,3,4,5};
printf("%d",a[1]);
```
輸出:
```
2
```
---
2.我想知道b陣列裡面所有的索引值依序有什麼值。
```c
int b[5]={6,7,8,9,10};
for(int i=0;i<5;i++){
printf("%d ",b[i]);
}
```
| b[0] | b[1] | b[2] | b[3] | b[4] |
| ---- | ---- | ---- | ---- |:---- |
| 6 | 7 | 8 | 9 | 10 |
輸出:
```
6 7 8 9 10
```
---
## 常犯問題
1.在main函式裡,陣列不能開太大,要在main外面宣告才能開比較大(極限大概1百萬左右),而且會幫你的陣列全部初始化為0。
舉例:
```c=
#include<stdio.h>
const int SIZE=100000000;
int a[SIZE];
int main(){
}
```
---
2.請記得在使用陣列前就先宣告,不要用動態宣告
舉例:
```c
int n;
scanf("%d",&n);
int a[n];
```
:-1:
```c
const int SIZE=1000000;
int a[SIZE];
```
:+1:
---
3.當想要將a陣列全部的值都轉到b陣列上
```c=
int a[3]={1,2,3};
int b[3];
b = a;
```
注意不能這樣寫,要一個一個用迴圈複製過去
```c=
int a[3]={1,2,3};
int b[3];
for(int i=0; i<3;i++){
b[i] = a[i];
}
```
## 二維陣列
### 如何宣告
```
資料型態 陣列名稱[陣列大小][陣列大小]
```
舉例:
```c
int a[10][10];
float b[10][10];
long long int c[10][10];
char d[10][10];
```
或
```c
const int SIZE=100;
int a[SIZE][SIZE];
float b[SIZE][SIZE];
long long int c[SIZE][SIZE];
char d[SIZE][SIZE];
```
### 看一下圖片

---
### 初始化
跟一維差不多。
1.當我想放我想要的值
```c
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
```
就會變成:

初始化的狀況都跟一維差不多,自己可以試試看。
---
### 賦值
1.當我想讓a[2][1]的值變成10
```c
int a[3][3]={0};
a[2][1]=10;
```

---
2.當我想要輸入9,6,7,4,5,3,2,8,1進去
一維陣列是用單層迴圈
那二維理所當然要用雙層迴圈(巢狀)
```c
int a[3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
scanf("%d",a[i][j]);
}
}
```

---
## 輸出
一樣用雙層迴圈
舉例:
```c
#include<stdio.h>
int main(){
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
```
輸出:
```
1 2 3
4 5 6
7 8 9
```
---
再高維的陣列都是一樣的東西,可以自己試試看。
## 排序
以前教過兩個數字和三個數字的。
那如果很多個數字怎麼辦?
那就需要陣列的幫忙。
### 泡沫排序法
先看一下動畫

網路上有很多寫法,都可以去參考看看。
我的程式碼:
```c
#include<stdio.h>
int main(){
int a[10]={3,4,2,1,6,5,8,7,10,9};
int t;
for(int i=10;i>=0;i--){
for(int j=0;j<i-1;j++){
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
}
```
將她的過程輸出出來(交換的時候)
```
3 2 4 1 6 5 8 7 10 9
3 2 1 4 6 5 8 7 10 9
3 2 1 4 5 6 8 7 10 9
3 2 1 4 5 6 7 8 10 9
3 2 1 4 5 6 7 8 9 10
2 3 1 4 5 6 7 8 9 10
2 1 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
```
結果輸出:
```
1 2 3 4 5 6 7 8 9 10
```
###### tags: `中和高中`