陣列與動態配置記憶體

參考文件

new/delete

建立陣列記憶體位址

資料型態 *陣列名 = new 資料型態[長度];

new傳回值是陣列第0筆元素記憶體位址,由指標(*陣列名)接收傳回的記憶體位址。

記憶體回收

delete[] 指標變數;

不能使用sizeof()

因為陣列名是指標,使用sizeof(陣列名)只會傳回8btye

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
int main() {
  //分配連續100個int的記憶體空間
  int *arr_p = new int[100];
  cout << "使用陣列索引:" << endl;
  //使用索引修改陣列的元素
  for (int i = 0; i < 100; i++) {
    arr_p[i] = i;
  }
  //使用索引印出陣列的元素
  for (int i = 0; i < 100; i++) {
    cout << arr_p[i] << ",";
  }
  cout << endl;
  cout << "使用指標:" << endl;
  //使用指標修改陣列的元素
  for (int i = 0; i < 100; i++) {
    *(arr_p + i) = i + 100;
  }
  //使用指標印出陣列的元素
  for (int i = 0; i < 100; i++) {
    cout << *(arr_p + i) << ",";
  }
  cout << endl;
  //陣列記憶體回收
  delete[] arr_p;
  //指標設為nullptr代表不指向任何記憶體位址
  arr_p = nullptr;
  return 0;
}
執行結果
使用陣列索引:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,
使用指標:
100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,

陣列其它用法

全設為0

int *arr_p1 = new int[3]();

設定初始值

int *arr_p2 = new int[3]{1,2,3}; //1,2,3

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int main() {
  //全設0
  int *arr_p1 = new int[3](); // 0,0,0
  //設初始值
  int *arr_p2 = new int[3]{1,2,3}; //1,2,3
  //用索引取值
  cout << arr_p1[0] << "," << arr_p1[1] << "," << arr_p1[2] <<  endl;
  //用指標取值
  cout << *(arr_p2 + 0) << "," << *(arr_p2 + 1) << "," << *(arr_p2 + 2) <<  endl;
  //記憶體回收
  delete [] arr_p1;
  delete [] arr_p2;
  //指標設為不指向任何記憶體位址
  arr_p1 = nullptr;
  arr_p2 = nullptr;
  return 0;
}
執行結果
0,0,0
1,2,3

results matching ""

    No results matching ""