ETH官方钱包

創作內容

1 GP

C++筆記-記憶體操作

作者:阿硯│2018-03-01 16:15:41│巴幣:10│人氣:228

[HackMD]

運算子 & , * , []

  • &var :取得變數的記憶體位址
  • *ptr  :取得指標所指向的記憶體

int  i  = 5487 ;
int* pi = &i;
cout << &i  << endl; //0x28fef8
cout << *pi << endl; //5487
cout << *&i << endl; //5487
cout << *&*pi << endl; //5487


  • array[index] :同 *(array+index)
但是! 因為C++可以重載運算子,所以也可以修改這個運算子,讓他的功能跟這裡寫得不一樣,這裡寫的只是預設。

int array[3] = { 10, 20, 30 };
cout << array[1] << endl ; //20
cout << *(array+2) <<endl; //30
cout << array[3] << endl ; //5487 緩衝區溢位(為什麼不是pi的內容,我猜是編譯器自動優化)


  • stack緩衝區溢位
int a0 = 1000;
int a1 = 2000;
char c[4] = {3,2,0,0};
int  a[3] = {300,400,500};
cout<< a[3] <<endl; //515 = 3*1 + 2*256
cout<< a[4] <<endl; //2000
cout<< a[5] <<endl; //1000

  • 記憶體對齊
int a0 = 1000;
int a1 = 2000;
char c[2] = {3,2};
int  a[3] = {300,400,500};
cout<< a[3] <<endl; //515+???
cout<< a[4] <<endl; //2000
cout<< a[5] <<endl; //1000

  • 記憶體對齊: 縮小class的size
class A{
    char a;
    int  b;
    bool c;
};
class B{
    char a;
    bool b;
    int  c;
};


//main()
cout<< sizeof(A) <<endl; //12
cout<< sizeof(B) <<endl; //8


指標,參考

  • 指標(pointer)
宣告type* ptr;
配置一塊4bytes的記憶體(因為是32bit程式,address大小32bit)
  • 參考(reference)
宣告type& ref = var;
會不會配置記憶體給他??我不知道

int  i    = 5487 ;
int* ptri = &i;
int& refi =  i;
cout<<    i <<endl; //5487
cout<< ptri <<endl; //0x28fef8
cout<< refi <<endl; //5487

看這三個變數的記憶體位置,i 和 refi 是一樣的
cout<< &i    <<endl; //0x28fef8
cout<< &ptri <<endl; //0x28fef4
cout<< &refi <<endl; //0x28fef8




  • function argument
type function(type);
  1. call by value
  2. call by pointer
  3. call by reference

void byVal(int  val){
    cout<< &val;
    ++val;
}
void byPtr(int* ptr){
    cout<< &ptr;
    ++(*ptr);
}
void byRef(int& ref){
    cout<< &ref;
    ++ref;
}

//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();
  1. return value
  2. return pointer
  3. return reference
只要argument的部分懂了,這個就懂了
只是這裡主要用在class裡面。

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;}
};

//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

  • 指標的另一個用途: 動態陣列
int size;
int* dynArray;

cin>>size;
dynArray = new int[size];

//do something

delete[] dynArray;//用完後要delete
  • 有問題的動態陣列
int size;
cin>>size;
int arr[size];//應該會有編譯error,但不知道為什麼我測試沒有,求解
引用網址:http://www.jamesdambrosio.com/TrackBack.php?sn=3905296
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

1喜歡★kauhia 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:小小戰爭1.0... 後一篇:C++容器-簡介...


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情? 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】