陣列

陣列是固定大小,設定完大小,無法改變陣列大小。

初始化值

方式一

1
2
3
4
5
6
7
8
9
10
int main() {
  int arr[3];
  arr[0] = 10;
  arr[1] = 20;
  arr[2] = 30;
  cout << "arr[0] = " << arr[0] << endl;
  cout << "arr[1] = " << arr[1] << endl;
  cout << "arr[2] = " << arr[2] << endl;
  return 0;
}
arr[0] = 10
arr[1] = 20
arr[2] = 30

方式二

資料型態 陣列名[] = {值1, 值2, 值3 ...};

以下是沒有設定陣列大小,但有給初始值。

1
2
3
4
5
6
7
int main() {
  int arr[] = {10, 20, 30};
  cout << "arr[0] = " << arr[0] << endl;
  cout << "arr[1] = " << arr[1] << endl;
  cout << "arr[2] = " << arr[2] << endl;
  return 0;
}
arr[0] = 10
arr[1] = 20
arr[2] = 30

方式三

資料型態 陣列名[長度] = {值1, 值2, 值3 ...};

若值的數量比長度小,沒有在括號{}中的值預設為0。

以下是有設定陣列大小,有給初始值。

1
2
3
4
5
6
7
int main() {
  int arr[10] = {0,1,2,3};
  for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
    cout << "arr[" << i << "] = " << arr[i] << endl;
  }
  return 0;
}
arr[0] = 0
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 0
arr[5] = 0
arr[6] = 0
arr[7] = 0
arr[8] = 0
arr[9] = 0

陣列大小設定

陣列的大小設定可以用常數、運算式。

常數

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
//用常數設定大小
const int ARR_MAX = 10;
int main() {
  // 設定大小
  int arr[ARR_MAX] = {0,1,2,3};
  for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
    cout << "arr[" << i << "] = " << arr[i] << endl;
  }
  return 0;
}
arr[0] = 0
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 0
arr[5] = 0
arr[6] = 0
arr[7] = 0
arr[8] = 0
arr[9] = 0

運算式

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int main() {
  double d = 10;
  //使用運算式設定陣列大小
  int arr[sizeof(d)/2] = {0,1,2,3};
  int size = sizeof(arr)/sizeof(int);
  cout << "arr size = " << size << endl;
  for (int i = 0; i < size; i++) {
    cout << "arr[" << i << "] = " << arr[i] << endl;
  }
  return 0;
}
arr size = 4
arr[0] = 0
arr[1] = 1
arr[2] = 2
arr[3] = 3

陣列中有多少元素?

sizeof(陣列名) / sizeof(陣列資料型態) = 元素個數

sizeof(陣列名) 是取得這個陣列占記憶體的大小。

sizeof(資料型態)
是取得資料資料型態占的記憶體大小,如int占4byte,double占8byte,char占1byte。

陣列中每一個值都初始化為整數0

陣列若是全局變數,會自動初始化為預設值,如int是0、char是\0
但陣列若為區域變數,裡面的值預設是亂七八糟的值,不會自動設初始值。
因此需要初始化陣列中的值。

以下二種寫法都是一樣,初始化為整數0。

資料型態 陣列名[長度] = {0};
資料型態 陣列名[長度] = {};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
int main() {
  int arr[10] = {0};
  for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
    cout << "arr[" << i << "] = " << arr[i] << endl;
  }
  
  int arr1[10] = {};
  for (int i = 0; i < sizeof(arr1)/sizeof(int); i++) {
    cout << "arr1[" << i << "] = " << arr1[i] << endl;
  }
  return 0;
}
執行結果
arr[0] = 0
arr[1] = 0
arr[2] = 0
arr[3] = 0
arr[4] = 0
arr[5] = 0
arr[6] = 0
arr[7] = 0
arr[8] = 0
arr[9] = 0
arr1[0] = 0
arr1[1] = 0
arr1[2] = 0
arr1[3] = 0
arr1[4] = 0
arr1[5] = 0
arr1[6] = 0
arr1[7] = 0
arr1[8] = 0
arr1[9] = 0

memset陣列清空

陣列若是全局變數,會自動初始化為預設值,如int是0、char是\0
但陣列若為區域變數,裡面的值預設是亂七八糟的值,不會自動設初始值。
因此需要初始化陣列中的值。

陣列中每個元素記憶體位址的值設為0。

void* memset(void *s, int c, size_t n);
參數1 : 陣列名
參數2 : 整數0
參數3 : 陣列記憶體大小
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int main() {
  int arr[10] = {1,2,3,4,5,6,7,8,9};
  for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
    cout << "arr[" << i << "] = " << arr[i] << endl;
  }
  memset(arr, 0, sizeof(arr));
  for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
    cout << "arr[" << i << "] = " << arr[i] << endl;
  }
  return 0;
}
執行結果
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
arr[5] = 6
arr[6] = 7
arr[7] = 8
arr[8] = 9
arr[9] = 0
arr[0] = 0
arr[1] = 0
arr[2] = 0
arr[3] = 0
arr[4] = 0
arr[5] = 0
arr[6] = 0
arr[7] = 0
arr[8] = 0
arr[9] = 0

陣列無法重新指向其它記憶體位址

陣列名是記憶體位址,不是指標,不能把陣列名指向其它記憶體位址。
以下程式試圖把陣列指向其它記憶體位址,都會編譯失敗。
可以修改陣列中的值,但不能把陣列的起始位址指向其它記憶體位址。

1
2
3
4
5
6
int main() {
  int arr[] = {10, 20, 30};
  int arr2[] = {40, 50, 60};
  arr = arr2;
  return 0;
}
1
2
3
4
5
6
int main() {
  char c[] = "abc";
  printf("%s \n",c);
  c = "ggg"; 
  return 0;
}

memcpy() 複製陣列,記憶體內容複製

複製全部元素

陣列中全部的元素(來源陣列)複製到另一個大小相同的陣列(目標陣列)。

需要引入函式庫#include

void* memcpy(void* dest, const void* src, size_t n)
參數1 : 目標陣列
參數2 : 來源陣列
參數3 : 陣列記憶體大小,或使用者自行定義要複製的byte。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main() {
	//來源陣列
  int arr[10] = {1,2,3,4,5,6,7,8,9,10};
  for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
    cout << "arr[" << i << "] = " << arr[i] << endl;
  }

  //目標陣列
  int arr1[sizeof(arr) / sizeof(int)];
  memcpy(arr1, arr, sizeof(arr));
  for (int i = 0; i < sizeof(arr1)/sizeof(int); i++) {
    cout << "arr1[" << i << "] = " << arr1[i] << endl;
  }
  return 0;
}
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
arr[5] = 6
arr[6] = 7
arr[7] = 8
arr[8] = 9
arr[9] = 10
arr1[0] = 1
arr1[1] = 2
arr1[2] = 3
arr1[3] = 4
arr1[4] = 5
arr1[5] = 6
arr1[6] = 7
arr1[7] = 8
arr1[8] = 9
arr1[9] = 10

複製部分元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
int main() {
  //來源陣列
  int arr[10] = {1,2,3,4,5,6,7,8,9,10};
  for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
    cout << "arr[" << i << "] = " << arr[i] << endl;
  }

  //目標陣列
  //元素全初始化為整數0
  int arr1[sizeof(arr) / sizeof(int)] = {0};
  //只複製arr陣列8byte的元素
  //(8byte/每個元素是4byte)=2,只複製2個元素
  memcpy(arr1, arr, 8);
  for (int i = 0; i < sizeof(arr1)/sizeof(int); i++) {
    cout << "arr1[" << i << "] = " << arr1[i] << endl;
  }
  return 0;
}
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
arr[5] = 6
arr[6] = 7
arr[7] = 8
arr[8] = 9
arr[9] = 10
arr1[0] = 1
arr1[1] = 2
arr1[2] = 0
arr1[3] = 0
arr1[4] = 0
arr1[5] = 0
arr1[6] = 0
arr1[7] = 0
arr1[8] = 0
arr1[9] = 0

results matching ""

    No results matching ""