---
tags: C++, 程式設計
---
# C++ 陣列與指標 (上)
## 一、陣列
### (一)宣告
```cpp=
int a[5]; //宣告一個有5個元素的int陣列
//【單獨設定陣列裡的值】
a[0]=10; //陣列的索引是從0開始
a[1]=15;
a[2]=20;
a[3]=25;
a[4]=30;
a[5]=38;
cout<<"a[0]="<<a[0]<< endl; // a[0] = 10
cout<<"a[4]"<<"a[4]"<<endl; // a[4] = 38
for (int i =0; i<5;i++)
a[i]=i*5; //0,5,10,15,20
for (int i=0; i<5;i++)
cout <<"a["<<i<<"]"<<a[i]<<endl;
//a[0]=0
//a[1]=5
//a[2]=10
//a[3]=15
//a[4]=20
```
### (二)設定初始值
```cpp=
//【方法一】直接設定
int b[5] = {1,2,3,4,5}; //設定5格陣列,並給5個值
int c[]= {1,2,3,4,5}; //設定陣列不給值,系統看你給幾個值給幾格。
int d[5]={1,2,2} //設定5格陣列,但只給3個值,其餘系統會補零 {1,2,2,0,0}
//【方法二】單一輸入
cin>>a[0];
cin>>a[1];
//【方法三】使用迴圈
cout << "請輸入五個數" <<endl;
for(int i = 0; i < 5; i++ )
{
cout< < "請輸入第"<<(i+1)<<"個數字:"
cin >> a[i];
}
```
### (三)陣列大小
```cpp=
//sizeof()
cout << sizeof(a) << "個位元組" <<endl; //20個位元組
cout << sizeof(b) << "bytes" <<endl; //20 bytes
```
### (四)應用
#### 1、找最大值
```cpp=
//【方法一】
int Max = a[0];
for(int i =1; i <5;i++)
{
if(a[i]>Max)
Max = a[i];
}
```
#### 2、找最小值
```cpp=
//【方法一】
int Min = a[0];
for(int i =1; i <5;i++)
{
if(a[i]<Min)
Min = a[i];
}
```
#### 3、氣泡排序(初等)
```cpp=
//【方法一】寫法版本有很多種
//假設A[5]={6,3,7,1,9}
//由大排到小
for(int i =0; i< ; i++){
for(int j = (i+1) ; j < 5 ;j++){
if(a[i] < a[j]){
a[i] = a[j];
a[j] = temp;
}
}
}
// 回合一:9,3,6,1,7
// 回合二:9,7,3,1,6
// 回合三:9,7,6,1,3
// 回合四:9,7,6,3,1
// 回合四:9,7,6,3,1
```
## 二、字元陣列
### (一)宣告
```cpp=
char ch[5]; //宣告格子為5的陣列(裡面的資料為字元)
ch[0] = 'a'; //陣列索引一樣從零開始
ch[1] = 'b';
ch[2] = 'c';
ch[3] = 'd';
ch[4] = 'e';
for (int i = 0; i < 5 ; i++)
ch[i] = i + 97; //a,b,c,d,e 【字元的數字為ASCII碼】
for(inr i=0; i<5;i++)
cout <<"ch["<<i<<"]=" << ch[i] << endl; //a,b,c,d,e
```
[可參考前筆記變數(上)(四)](/EdKRVklvRCmfNCN7pFw_Gg)
### (二)設定初始值
```cpp=
int f[] ={1,2,3,4,5};
char n1[]="John Simth"; //方法一
Char n2[] = {'M','a','r','r','y','','W','h','i','t','e'} //方法二
// 方法一與二的差異在是否有結束字元 \0
cout << n1 <<endl; //output: John Simth
cout << n2 <<endl; //output: Marry white+亂碼
```
#### 使用方法一:程式會在在字元後自動加結束字元
| J | o | h | n | | s | i | m | t | h | \0 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
#### 使用方法二:程式會不會在字元後加結束字元,所以會一直往後找到結束字元才結束 ()
| M | a | r | y | | W | h | i | t | e | X | X | X | X | X | X | ... | X | \0 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---- | --- |
#### (三)字串大小
```=cpp
cout << sizeof(n1) << "bytes" <<endl; // 11 bytes (10字元+結束字元)
cout << sizeof(n2) << "bytes" <<endl; // 10 bytes (由設定初始值記憶體空間)
```
##### cout 會有印出至結束位元停止,但sizeof不會但使用【方法一】系統會多加一個結束字元故+1 bytes
## 三、標準函式庫
[可參考前筆記(一)](/IzUZdhn6RYmX-QC6ce7rYg)
### (一)strlen()、cin.getline()指令
```cpp=
#include <cstring> //補充在程式開頭
//strlen() //字串長度
//cin.getline(陣列,格子) //輸入字串使用
char name[80];
cout << "請輸入一字串:";
cin.getline(name,80);
//假如使用者輸入 Taipei City
cout << sizeof(name) << endl; // 80 空間大小
cout << strlen(name) << endl; // 11 字串長度
```
#### 1、重要補充
##### (1)cin.ignore(); (忽略前面的資料流)
##### (2)範例
```cpp=
int i;
cout <<"請輸入一整數:";
cin >> i; //留下換行符號的資料流
cout <<"請輸入一字串:";
cin.getline(name,80);
//假如使用者輸入 Taipei City
cout << sizeof(name) << endl; // 80 空間大小
cout << strlen(name) << endl; // 0 字串長度
//故會影響答案正確性
//如果cin.getline()出現問題
//改善:將cin.ignore()指令打在cin.getline的上一個即可。
```
### (二)strcpy,strncpy 複製字串
#### (因為安全性問題,目前改用strcpy_s, strncpy_s,使用方法一樣)
#### 1、範例
```cpp=
char str1[]="Lazy Boy";
char str2[]="Cute Girl";
char str3[]="Pink Panther";
cout << "str1:" << str1 << endl; //str1: Lazy Boy
cout << "str1:" << str2 << endl; //str2: Cute Girl
cout << "str1:" << str3 << endl; //str3: Pink Panther
// str2 = str1 為錯誤示範
strcpy_s(str2,str1); //str2 = str1 = Lazy Boy
cout << "str2:" << str2 << endl; //str2: Lazy Boy
//部分修改取代
strcpy_s(str3,str1,4); //str3(前4個字被取代)
cout << "str3:" << str3 << endl; //str3: Lazy Panther
```
### (三)strcmp,strncmp 比對字串(相同回傳0)
#### 以下並非比較內容,而是比較【address】
#### 1、範例
```cpp=
str1 == str2;
str1 > str2;
str1 < str2;
if(strcmp(str1,str2)==0){
cout << "字串內容相同";
}
if(strcmp (str1,str3,4)==0){
cout << "字串的前4個字內容相同";
}
```
## 四、練習
### (一)題目一:
(1) 由鍵盤輸入任意5個數(小數),輸出最小值Min與平均值Avg
```cpp=
#include <iostream>
using namespace std;
/*題目1:由鍵盤輸入任意5個數(小數),輸出最小值Min與平均值Avg*/
int main() {
float A[5];
int i,j;
float sum;
sum = 0.0;
for (i = 0; i < 5; i++) {
cout << "請輸入A["<< i << "]的值:";
cin >> A[i];
}
int min = A[0];
for (i = 1; i < 5; i++) {
if (min > A[i])
min = A[i];
}
cout << "陣列中最小值:" << min << endl;
for (i = 0; i < 5; i++) {
sum = sum + A[i];
}
sum = sum / 5;
cout << "陣列中的值平均數為:" << sum;
}
```
### (二)題目二:
在「字元陣列」中放入10個英文字母「television」,然後將字母依小到大(a到z)順序從螢幕輸出。
```cpp=
#include <iostream>
using namespace std;
/*題目2:在「字元陣列」中放入10個英文字母「television」,然後將字母依小到大(a到z)順序從螢幕輸出*/
int main() {
char A[10];
int i, j, k;
float sum;
for (i = 0; i < 10; i++) {
cout << "請輸入A[" << i << "]的字元:";
cin >> A[i];
}
for (i = 0; i < 10; i++) {
for (j = i + 1; j < 10; j++) {
if (A[i] > A[j]) {
k = A[i];
A[i] = A[j];
A[j] = k;
}
}
}
cout << "陣列內容由小排列至大" << endl;
for (i = 0; i < 10; i++) {
cout << A[i];
}
}
```
### (三)題目三:
請宣告兩個整數型別的一維陣列,其中一個設定初始值,然後將此陣列的值,複製到另一個陣列。
```cpp=
#include <iostream>
using namespace std;
/*題目3:請宣告兩個整數型別的一維陣列,其中一個設定初始值,然後將此陣列的值,複製到另一個陣列。*/
int main() {
int A[10], B[10];
int i, j;
for (i = 0; i < 10; i++) {
cout << "請輸入A[" << i << "]的值:";
cin >> A[i];
}
cout << endl;
cout << "陣列A的內容:" << endl;
for (i = 0; i< 10; i++)
cout << A[i] << ",";
cout << endl;
cout << "陣列B的內容:" << endl;
for (j = 0; j < 10; j++) {
B[j] = A[j];
cout << B[j] << ",";
}
}
```