壹、new 和 delete
首先,妳需要知道程序在內存中。它分為四部分:
code:代碼
data: 數據(全局、靜態變量)
stack:棧(局部變量)
heap:堆(妳負責的地方,比如用來動態內存分配,即new和delete)
程序運行時所需要的數據空間,通常是在程序設計時通過定義變量或數組的方式,由系統預先分配。比如定義壹個對象,在程序運行過程,它的空間不能隨時釋放。
產生背景:①在程序設計時,有些數據空間的大小和多少在編寫程序時 還不能確定,只有在程序運行時才能確定。 ②有時希望在需要對象時才建立,不需要就立刻撤銷它,釋放其內存供別的數據使用。
解決:使用堆(heap)內存可以實現這壹功能。堆是壹種內存空間,它允許程序運行時 根據需要申請大小的內存空間。堆又稱動態內存分配。
使用方法:
new運算符:
1、使用格式:指針=new 數據類型名;
指針=new 數據類型名(初始值);
作用: 從內存的動態區域申請指定數據類型所需的存
儲單元。若分配成功,該存儲單元的首地址賦
給指針,否則,指針得到壹個空地址。
例如:
(1) double *p;?
p=new double;
(2) double *p;?
p=new double(12.3576); //分配同時初始化
2、指針=new 數據類型〔元素個數〕?
用new在堆中申請壹塊連續的存儲空間(壹維數組)
例:
int size, *ip;
cin>>size;
ip=new int[size]; //創建size個元素的整型數組
char *sp=new char[20]; //創建20個字符的字符數組
delete運算符:
使用格式:
delete 指針名; //釋放指針所指內存單元
delete 〔 〕指針名; //釋放數組內存單元?
作用:釋放用new創建的動態存儲單元 。
例如:
int *pi=new int(5);?//創建
delete pi;? //釋放
pi=new int;? //再創建
註意:
delete運算符並不刪除指針。
對於指向動態分配內存單元的指針,在其所指向的內存單元沒有釋放前, 該指針不能重新賦值。
每個new運算符創建的內存單元,只能用delete釋放壹次。而且壹個new對應壹個delete是最好的。
new和delete例子很不經意。實際用時發現問題再解決吧。
二、靜態指針 動態指針
好像沒有專門的定義“靜態指針”和“動態指針”吧!
C++中各種數據類型都可以指定指針變量。指針除了可以指向壹般變量外,還可以指向其他任何數據結構。壹般的指針的用法及計算妳肯定知道。
動態方面:
在用new動態建立(上面)壹個對象時,會返回壹個指向新對象的指針值,即分配的內存空間首地址。通過這個指針調用對象很方便。
靜態方面:
const :使數據在壹定範圍***享,又保證它不被隨意修改。即定義為常量。
① int * const p = a; //常指針
const修飾指針,p的指向不可變。在定義 的時候指向誰,就不能再變。
②const int * p = a; //指向常對象的指針
const 修飾類型int, p指向的數據內容不可變,即不能通過指針p改變a的值(但可以通過其他途徑)
ps:const型變量只能由 這種指針指向它。
指針太靈活,使用時小心為好,比如指針與數組,p++和*p++的區別等等。
End。