example1

先來看看一個範例

以上為一個簡單的範例,
他定義了一個int型態的指標a,
並且把12給到了*a
 
  
乍看之下好像沒有錯誤,
但其實犯了一個初學者學習動態記憶體常犯的一個錯誤
請問這樣執行有甚麼錯誤的地方嗎?
 
案: 少配置了記憶體
執行結果: 叭叭,程式發生錯誤,不會過。
example2  
所以是少了哪一句呢?
看看以下的改動
example3    
執行結果: *a=12 (正確放進並印出資料)
 
example4  
改動就在於關鍵的那一句  a  = new int ;
沒有挖記憶體給指標存12這個值,
就想要存值,所以發生錯誤
正確的做法:
int *a ;
a = new int ;
或是上兩句等同下面這一句
int *a = new int ;

 
想像例子:
傳令兵拿著一個門牌(會走動)   :指標
房子(空間)         :記憶體
傢俱(東西)         :整數 int 像數字12
(因為是int,一間房子只能裝一個傢俱,若是結構空間,則可以裝很多成員)
 
讓我們回頭看看第一個錯誤的範例
int *a ;
*a = 12;
經過我們想像就是 今天我們 產生了一個傳令兵拿著一個門牌(指標),他產生的時候不知道站在哪裡,由上天決定(就是系統)
然後我們把傢俱(int 12數字)就這樣丟給這個傳令兵,他站的門牌位址可能是政府的房子(他指向的位址可能是系統的位址)
這房子不能進去,也不能更改,或是根本沒有空間給他使用,
他不知道這傢俱要怎麼辦,於是告訴你發生錯誤了!!
example5  
 
但經過我們更改成
 
int *a ;
a = new int ;
*a = 12;
以後
這個傳令兵拿著門牌的位址我們已經分配一個合法的房子跟合法的房子地址給他了,
他不需要再煩惱沒有地方擺放傢俱了,於是就很開心的把傢俱(數字12)放在房子(記憶體)裡面了
當然以上也可以簡寫成
 
int *a = new int ;
 
*a = 12;
example6  
至於 new int 只新增了一個int , 若是我們要產生很多個記憶體放數字(產生很多房子放很多傢俱)該怎麼辦呢
答案:
一樣的,
 
int *a ; //指標 (門牌)
 
a = new int[5] ;  產生固定數量的房子
 
*a = 12; // 或是等同於*(a+0) = 12;
*(a+1) = 13; // *(a+1) = 13;
但由於我們要根據需要動態產生房子的數量
我們可以把他定義成變數 (可更動)
 
 
int *a ; //指標 (門牌)
int size =5;
 
 
 
a = new int[size] ;  幫眾多門牌們,分配可變動數量的房子, 門牌+房子 = 完美
 
 
 
*a = 12; // 或是等同於*(a+0) = 12;
 
*(a+1) = 13; // *(a+1) = 13;
example7  
 
example8  
現在我們房子是可以根據一開始所需要的數量來定義囉~ 
若你想要很多房子,也可以動態定義空間囉~
這就是最初始的動態記憶體的解說

不知道各位了不了解呢?

補充資料:

int *a;           //a是指向整數的指標

x = new int;  //向作業系統要一個整數空間並把這位址交給a

*a = 12;        //設定x指過去的地方的值為12

cout << "*a= " << *a;

 
 
v當無法預知arraysize(也就是無法用常數整數去宣告arraysize)或資料size大小時,我們必須動態記憶體配置
§Ex. 根據使用者想輸入的資料筆數,動態配置一組記憶體空間給其使用
§C++提供兩個有關動態記憶體配置的運算子new, delete
v新增動態記憶體
§格式:  資料型態  *指標變數 = new 資料型態 [size];
int *a = new int[n];  //此時將變數(非常數)n作為陣列大小是合法的!
char *sp = new char[30];  //宣告可以存放30個字的記憶體空間
 
arrow
arrow

    椿哥 發表在 痞客邦 留言(8) 人氣()