--- 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 = &pi; *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> 已知字串內容 # 指標與陣列 ![](https://i.imgur.com/oXWsFty.png) 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