小朋友學C++(45):指標與陣列的關係
陣列名稱實際上相當於一個指標,指向陣列第一個元素所在的地址。
例1 用指標方式輸入輸出陣列元素
#include <iostream> using namespace std; int main() { int n; cin >> n; int a[n]; for(int i = 0; i < n; i++) { // 挨個賦值 // p + i表示指標的位置挪動了i * sizeof(int)個記憶體地址,即指向了第i個元素 cin >> *(a + i) ; } for(int i = 0; i < n; i++) { cout << *(a + i) << endl; } return 0; }
執行結果:
分析:
在這個例子裡,a既是陣列名稱,也代表指向第一個元素的指標。
a + 0 = a表示第一個元素a[0]的地址,a + 1表示第二個元素a[1]所在的地址。a + 2表示第三個元素a[2]的地址。
(a + 0) = a[0], (a + 1) = a[1],*(a + 2) = a[2]。
注意,這裡a + 1不是表示a的地址直接加1,而是表示下一個元素的地址,即a指向的地址 + 1 * sizeof(元素型別)。
假設a[0]的地址為0x00000020,則
a = 0x00000020;
a + 1 = 0x00000020 + 1 * 4 = 0x00000024;
a + 2 = 0x00000020 + 2 * 4 = 0x00000028。
這裡之所以要乘以4,是因為每個整型資料佔4個位元組的記憶體。如果是字元型陣列,那麼應該乘以1,如果是double型陣列,那麼應該乘以8。
例2:動態申請記憶體
#include <iostream> using namespace std; int main() { int n; cin >> n; int *a = new int[n]; // 用new動態申請記憶體 for(int i = 0; i < n; i++) { cin >> *(a + i); } for(int i = 0; i < n; i++) { cout << *(a + i) << endl; } delete a;// 釋放記憶體 return 0; }
執行結果:
分析:
這裡使用了new來申請記憶體,delete來釋放記憶體。這是動態申請記憶體的方式。而int a[3];則是靜態申請記憶體的方式。
動態申請記憶體的方式,當你使用delete釋放後,這塊記憶體就可以另做它用了。而靜態申請的記憶體,若是為區域性變數申請的記憶體,則等當前函式執行完後,內被釋放;若是為全域性變數申請的記憶體,則等整個程式執行結束後,記憶體才會被釋放。
所謂“動態”,就是“隨時申請,隨時釋放”的意思。
C++用new/delete來動態申請/釋放記憶體,C語言則用malloc()/free()來動態申請/釋放記憶體。
少兒程式設計答疑、演算法答疑請加微信307591841或QQ307591841

諾依曼演算法公眾號.jpg