---
title:陳列(Array)與指標(Pointer)
tags: C++程式設計實習
---
# 陳列的宣告
```cpp=1
// 語法一: 宣告不給初值
資料型態 陳列名稱[陳列元素的數量];
// 語法二:宣告給初值
資料型態 陳列名稱[陳列元素的數量]={第1個元素的值,
第二個元素的值,..,
第陳列元素的數量-1的值};
資料型態 陳列名稱[ ]= {第1個元素的值,
第2個元素的值,..,
第陳列元素的數量-1的值};
// 語法三: 全部初值皆為0
int a[10] = {0};
int a[5] = {1, 2}; // a的第1個元素值為1, a的第2個元素值為2,其餘的元素值為0
```
1. 班上有30格學生 請宣告一個儲存30個學生成績的(陳列)變數
- 學生成績型態? double
- 儲存30個要使用何種容器? array
-double score[30];
2.宣告一個整數陣列 陣列中有5個元素 其值依序為1,2,3,4,5
# 陳列的存取(Access)
:::success
<font color='red'>**陳列的索引從0開始**</font>
:::
1. x = 陣列名稱[索引值]:將陣列的第索引值元素指定給 x
```cpp=
int a[]={1,2,3,4,5};
printf("%d", a[0]); //
```
2. 陳列名稱[索引值] = x; 將 x 指定給 陣列的所以位置的值
```cpp=
int a[]={1,2,3,4,5};
a[0]=100; // 將100指定為a的第1個元素值(1變成100)
a[3]=105; // 將100指定為a的第4個元素值(4變成105)
```
3.<font color='red'>**
```cpp
#include <iostream>
using namespace std;
// 顯示陣列每一個元素; 兩兩之間以一個空白隔開 最一個後面不能有空白
void print(int a[], int size){
for(int i=0; i<size-1; i++){
printf("%d ", a[i]);
}
printf("%d\n", a[size-1]);
}
// 將陣列元素依序頭尾對調
void reverse(int a[], int size){
int temp;
for(int i=0; i<(size/2); i++){
// 將 a[i] 存入temp: 從左邊往右邊的第i個索引位置值存入temp
temp = a[i];
// 將存右邊往左邊的第i個索引位置值存入從左往右第i個索引位置
a[i] = a[size-1-i];
// 將 temp 值存入 從右邊往左邊得第i個索引位置
a[size-1-i] - temp;
}
}
int main()
{
// 宣告一個包含10個整數的陣列a
int a[10];
// 指定 陣列a 的內容依序為1~10
for(int i=0; i<10; ++i){
// 陣列a第i個索引位置值為i+1
a[i] = i+1;
}
// 利用 sizeof()計算陣列的元素個數
int size = sizeof(a)/sizeof(a[0]);
// 呼叫 print() 顯示陣列每一個元素
print(a, size);
// 呼叫 reverser() 陣列元素反轉
reverse(a, size);
print(a, size);
return 0;
}
```
# 指標(pointer)
:::info
儲存的是一個記憶體的位置
:::
## 指標的宣告
1. 資料型態* 指標名稱;
2. \*p; // 宣告一個整數指標
```cpp=
int a = 5;
int *P = &a; // 指標p指向a(存a變數的記憶體位置)
```
# 指標(pointer)
:::info
儲存的是一個記憶體的位置
:::
## 指標的宣告
1. 資料型態* 指標名稱;
2. int \*p; // 宣告一個整數指標
cpp=
int a = 5;
int *p = &a; // 指標p指向a(存a變數的記憶體位置)
- &變數名稱: 代表取得變數名稱的記憶體位置
- \*指標變數: 代表取得指標變數名稱的記憶體位置的值
cpp=
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int *p = &a; // 指標p指向a(存a變數的記憶體位置)
printf("%p\n", p); // 顯示a變數的記憶體位置
printf("%d\n", *p); // 顯示a變數的記憶體位置的內容: 5
*p = 10; // a變數的記憶體位置的內容設為10
printf("%p\n", p); // 顯示a變數的記憶體位置
printf("%d\n", *p); // 顯示a變數的記憶體位置的內容: 5
// 個人電腦一般指標為8 bytes
printf("%d\n", sizeof(p));
double pi = 3.14;
double *dp = π
*dp = 3.14159;
// 個人電腦一般指標為8 bytes
printf("%d\n", sizeof(dp));
return 0;
}
# 字元陣列(字串)
1. 宣告方式: <font color='red'>**color='red'>**char 字串名稱[字串長度];**</font>
2. 可儲存的字串長度最多為<font color='red'>**(字串長度-1)個**</fontfont>字元 最後一個位置會自動加上'\0'</font>
3. I love Kinmen
4. 已出值來宣告: <font color='red'>**char 字串名稱[] = "字串內容";**</font> 已知字串內容
# 指標與陣列

1. 當指標指向某一陣列時 鎮列名稱表示陣列的起始記憶體位址
2. 當紙包指向某一陣列時 指標+1 代表往右一個元素的記憶體位置 指標-1 代表往左一個元素的記憶體位置
# 二維陣列
1. 宣告方式: 資料型態 陣列名稱[列數n][行數m];
2. 代表mat是一個$n\times m$的二維陳列(聚陣)
3. mat占用的記憶體維: sizeof(資料型態00000000000)
```cpp
#include <iostream>
using namespace std;
int get_length(chat s[]){
int i=0;
while(s[i++]!='\0');
return --i;
}
int main()
char s1[15]="I love Kinmen.";
for(int i=0; i<strlen(s1); i++){
printf("#%d: %d, %c\n", i, s1[i], s1[i]);
}
int i=0, len=0;
while(s1[i]!='\0'){
len++; i++;
}
printf("Length of s1 is %d\n", len);
i=0;
while(s1[i++]!='\0');
printf("Length of s1 is %d\n", (--i));
return 0;
}
```
```cpp