/*
 動態數組:
*/
#include<iostream>
using namespace std;

int main() {
    // new 是在堆內存裏面的,如果不 delete ,除非程序崩潰或者程序退出,否則內存一直佔用
    // new -> delete
    // new[] -> delete[]

    // 放在棧中
    int number_arr[10];
    number_arr[0] = 0;

    // 放在堆中
    int* arr_p = new int[10];
    arr_p[0] = 0;
    arr_p[1] = 1;
    arr_p[2] = 2;
    arr_p[3] = 3;

    // 對指針可以進行的基本操作
    // 1. [0] 獲取 0 位置
    // 2. + 操作,可以間接操作指針上的數據,(我覺得應該是地址位置向後移動)
    *(arr_p + 1) = 11;

    cout << "arr_p[0]: " << arr_p[0] << endl;
    cout << "arr_p[1]: " << arr_p[1] << endl;
    cout << "arr_p[2]: " << arr_p[2] << endl;
    cout << "arr_p[3]: " << arr_p[3] << endl;
    cout << "arr_p[4]: " << arr_p[4] << endl;
    delete[] arr_p;
    return 0;
}

C++學習(十六)指針的基本操作_程序退出 -> C++學習(十六)指針的基本操作_#include_02

xaye@orange:~/code/dev/12$ ./a.out 
arr_p[0]: 0
arr_p[1]: 11
arr_p[2]: 2
arr_p[3]: 3
arr_p[4]: 0

/*
 動態數組:
*/
#include<iostream>
using namespace std;

int main() {
    // new 是在堆內存裏面的,如果不 delete ,除非程序崩潰或者程序退出,否則內存一直佔用
    // new -> delete
    // new[] -> delete[]

    // 放在棧中
    int number_arr[10];
    number_arr[0] = 0;

    // 放在堆中
    int* arr_p = new int[10];
    arr_p[0] = 0;
    arr_p[1] = 1;
    arr_p[2] = 2;
    arr_p[3] = 3;

    // 對指針可以進行的基本操作
    // 1. [0] 獲取 0 位置
    // 2. + 操作,可以間接操作指針上的數據,(我覺得應該是地址位置向後移動)
    arr_p = arr_p + 1;
    *arr_p = 11;

    // *arr_p = arr_p + 1
    // *arr_p = 22;

    // arr_p[0] = arr_p;
    // arr_p[1] = arr_p + 1;
    // arr_p[2] = arr_p + 2;
     // 這樣操作會崩潰

    cout << "arr_p[0]: " << arr_p[0] << endl;
    cout << "arr_p[1]: " << arr_p[1] << endl;
    cout << "arr_p[2]: " << arr_p[2] << endl;
    cout << "arr_p[3]: " << arr_p[3] << endl;
    //cout << "arr_p[4]: " << arr_p[4] << endl;
    delete[] arr_p;
    return 0;
}
xaye@orange:~/code/dev/12$ ./a.out 
arr_p[0]: 11
arr_p[1]: 2
arr_p[2]: 3
arr_p[3]: 0
free(): invalid pointer
已中止 (核心已轉儲)

C++學習(十六)指針的基本操作_程序退出_03

注意:arr_p = arr_p + 1; 是將首地址向後移動一位, *arr_p就是給第一個元素賦值操作,所以 arr_p[0] 輸出是 11


/*
 從計算機電路來理解指針
 類比法理解:變量就是我的名字,指針就是我的住址,引用就是我的別名,二級指針是住址的住址,三級指針那就是住址的住址的住址,再往後以此往下類推。
 從計算機本質上理解:在計算機看來,變量、指針、住址、別名等等這些,都是不存在的,唯一存在的就是內存高低電壓(地址)。接下來,我們試着從計算機電路的
 角度來理解指針。 JavaOC->C/C++->彙編->CPU的運行原理->數字電路(門電路)

 代碼 -> 編譯鏈接 -> elf可執行文件(彙編代碼->機器碼指令)
*/
#include<iostream>
using namespace std;

int main() {
    //定義變量
    int number =1;
    //獲取指針
    int* p_number = &number;
    //通過指針操作變量賦值
    *p_number=2;
    cout << "number =" << number << endl;
    return 0;
}

實時查看源代碼對應的彙編輸出:https://godbolt.org/