期待已久的new物件環節,終於要來了。
在這之前我再給自己洗個腦
星號 指標 是值
指標是位址
程式設計師要告訴new,需要為那種型別的變數分配記憶體,new將找到乙個長度正確的記憶體塊,並返回該記憶體塊的位址。
程式設計師的責任是將該位址賦給乙個指標。
int
* pn =
newint
new運算子會根據後面的資料型別來決定要開多大的空間。
通過詢問和研究我認為,之所以需要new乙個指標是因為,new進行記憶體分配是因為這樣是動態的記憶體分配,且記憶體大小和存放型別是自己決定的。於是new會找到合適的記憶體空間並返回位址給指標變數
引用大佬的解釋 加深理解
1:宣告分配記憶體是在編譯階段進行的,new分配記憶體是在執行階段進行的2:宣告被放在棧中,new被分配在堆中或自由儲存區中
3:宣告建立陣列,在編譯階段是就為他分配記憶體。
使用new的原因
1.可以動態的申請空間,以便動態確定物件所需要的記憶體;
2.便於儲存大型物件,通常情況下棧區的大小容不下過於龐大的物件;
3.傳遞指標比傳遞整個物件更方便高效;
形象解釋
舉幾個生動形象的例子解釋以上三條原因:1. 每個人都要吃鹽,鹽不夠了再去買顯然比把這輩子要吃的鹽一次性買下來要明智
2.如果你是賣鹽的,儲存了很多鹽,你只需要建乙個倉庫把鹽放進去,然後自己記住倉庫位址即可,而不需要把鹽全部放在自己的家中;
3 如果要去很遠的地方談賣鹽的生意,只需要選一些有代表性的資訊(位址)給對方就可以了,不需要把整個倉庫搬過去給對方看。
#include
intmain()
執行結果
nights 的值是1001
:位址0x6ffe04
int值為1001
:位址0xcb1530
double 的值是1e+007
:位址0xcb1550
pd指標的位址是0x6ffdf8
size of pt =
8size of *pt4
size of pd =
8size of *pd8
釋放記憶體可以用delete
只有在new了一片記憶體空間之後才能用delete
例如
int
* ps =
newint
;delete ps;
//正確的用法
delete ps;
//由於ps已經被釋放,再次釋放可能會刪除更多的記憶體空間,結果是不確定的
int jugs =5;
int* pi =
&jugs;
//這個是放位址的指標
delete pi;
//宣告產生的指標不可以這樣釋放
delete的內容是new分配的記憶體,也就是說不一定要是被new的指標,而是一定要有new的位址
int
* ps =
newint
;int
* pq = ps;
delete pq;
在這裡delete刪除掉的是ps內容的記憶體,而ps的內容位址是由new分配的。
new分配動態陣列是更重要的,因為小型變數往往宣告就可以了。
在編譯時給陣列分配記憶體叫做靜態聯編,意味著陣列是在編譯時加入到程式中的。但是在使用new時,如果在執行階段需要陣列,則建立它,如果不需要則不建立。還可以在程式執行的過程中選擇陣列的長度,這被稱之為是動態聯編。這意味著陣列是在程式執行中被建立的,所以稱之為動態陣列。
new建立動態陣列和delete釋放
int
* psome =
newint[10
];delete
psome;
psome指向的是陣列的首位址
寫方括號是因為要告訴程式應該釋放整個陣列而不僅僅是指標所指向的元素。(注意new和delete的格式要匹配,不能乙個帶方括號乙個不帶)
在使用new和delete時要符合以下原則
不要使用delete來釋放不是new分配的記憶體在c和c++中指標和陣列幾乎可以等同使用,可以用陣列名(指標名)[索引]的方法來訪問陣列元素。不要使用delete釋放同一塊記憶體兩次
如果使用new為陣列分配記憶體,則應使用delete來釋放。
如果使用new為乙個實體分配記憶體,則應使用delete(無方括號)來釋放
對空指標delete是安全的
#include
intmain()
執行結果
p3[
1] 是0.5
.現在我把p3加1了,p3[
0]的值為0.5
p3[1
]為0.8
.
這裡面可以看出,雖然陣列名不可更改,但是指標的值可以更改,如果指標加一,那麼會指向陣列的下乙個元素。而這也取決於指標的型別,明天繼續學指標運算 c 學習筆記十
建立自已的資料型別 1 對像的概念 2 c 中的結構 定義結構型別 格式如下 struct book 宣告結構型別的變數 struct book back 建立結構型別的對像 陣列類似 book novel 訪問結構對像的成員 novel.year 對結構使用指標 book pbook 0 如果定義...
c 學習筆記十
26 a.公有類繼承 繼承方式的作用 控制基類中宣告的成員在多大的範圍內能被派生類的使用者訪問。include class location int gety private int x,y void location initl int xx,int yy void location move i...
c 學習筆記十
建立自已的資料型別 1 對像的概念 2 c 中的結構 定義結構型別 格式如下 struct book 宣告結構型別的變數 struct book back 建立結構型別的對像 陣列類似 book novel 訪問結構對像的成員 novel.year 對結構使用指標 book pbook 0 如果定義...