C++ 記憶體 === ###### tags: `cpp` [舊版](https://hackmd.io/s/HktK-mYGf#) --- > **變數(物件)** > 在記憶體中的一個*固定大小的*區塊,可以儲存*2進制*的資料。 > 屬性:記憶體位置、二進制資料、儲存資料類型。 > **參考** > 某一變數的別名。 > 好像也是指標,因為參考能做的指標都能做,只是比較麻煩。 > **指標** > 儲存記憶體位置的*變數*。 > 指標也是一個變數,只是它儲存的資料是別的變數的記憶體位置。 > **陣列** > 一連串同類型的記憶體區塊。 > 陣列的名稱也等於第一個元素的記憶體位置。 --- ## 運算子 `&` , `*` , `[]` > `&var` :回傳物件的**記憶體位址** > `*ptr` :回傳指標所指向的**物件**的參考 > `array[index]` :同 `*(array+index)`等差數列 > > ***但是!** 因為C++可以 **重載運算子**,所以也可以修改這些運算子,讓他的功能跟這裡寫得不一樣,這裡寫的只是預設。* --- ## 宣告 `*` , `&` > **指標(pointer)** > > 宣告`type* ptr;` > > 配置一塊4bytes的記憶體(因為是32bit程式,address大小32bit) > **參考(reference)** > > 宣告`type& ref = var;` > > 會不會配置記憶體給他??我不知道 --- > function argument > type function(**type**); > > call by value > > call by pointer > > call by reference > 三種函數 ```cpp=1 void byVal(int val){ cout<< &val; ++val; } void byPtr(int* ptr){ cout<< &ptr; ++(*ptr); } void byRef(int& ref){ cout<< &ref; ++ref; } ``` ```cpp=16 //main() int i = 5487 ; cout << &i <<endl;//0x28fefc byVal(i); //0x28fee0 cout<< i <<endl; //5487 byPtr(&i); //0x28fee0 cout<< i <<endl; //5488 byRef(i); //0x28fefc cout<< i <<endl; //5489 ``` --- > function return > **type** function(); > > return value > > return pointer > > return reference ``` 只要argument的部分懂了,這個就懂了 只是這裡主要用在class裡面。 ``` ```cpp=1 class Test{ public: int a; Test(int a):a(a){} int getAVal(){ return a;} int* getAPtr(){ return &a;} int& getARef(){ return a;} Test* retThis(){ return this;} }; ``` ```cpp=15 //main() Test obj(0); cout<< obj.a <<endl; //0 //obj.getAVal()++; //error:回傳值無法改變 ( *( obj.getAPtr() ) )++; cout<< obj.a <<endl; //1 obj.getARef()++; cout<< obj.a <<endl; //2 obj.retThis()->getARef()++; cout<< obj.a <<endl; //3 ``` --- ## new delete 指標的另一個用途: 動態陣列 ```cpp=1 int size; int* dynArray; cin>>size; dynArray = new int[size]; //do something delete[] dynArray;//用完後要delete ``` > 有問題的動態陣列 ```cpp=1 int size; cin>>size; int arr[size];//應該會有編譯error,但不知道為什麼我測試沒有,求解 ``` ---