new的用法

創(chuàng)新互聯(lián)公司憑借專(zhuān)業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專(zhuān)業(yè)的網(wǎng)站策劃、成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)站優(yōu)化、軟件開(kāi)發(fā)、網(wǎng)站改版等服務(wù),在成都十載的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都千余家中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。
開(kāi)辟單變量地址空間
使用new運(yùn)算符時(shí)必須已知數(shù)據(jù)類(lèi)型,new運(yùn)算符會(huì)向系統(tǒng)堆區(qū)申請(qǐng)足夠的存儲(chǔ)空間,如果申請(qǐng)成功,就返回該內(nèi)存塊的首地址,如果申請(qǐng)不成功,則返回零值。
new運(yùn)算符返回的是一個(gè)指向所分配類(lèi)型變量(對(duì)象)的指針。對(duì)所創(chuàng)建的變量或?qū)ο螅际峭ㄟ^(guò)該指針來(lái)間接操作的,而動(dòng)態(tài)創(chuàng)建的對(duì)象本身沒(méi)有標(biāo)識(shí)符名。
一般使用格式:
格式1:指針變量名=new 類(lèi)型標(biāo)識(shí)符;
格式2:指針變量名=new 類(lèi)型標(biāo)識(shí)符(初始值);
格式3:指針變量名=new 類(lèi)型標(biāo)識(shí)符?[內(nèi)存單元個(gè)數(shù)];
說(shuō)明:格式1和格式2都是申請(qǐng)分配某一數(shù)據(jù)類(lèi)型所占字節(jié)數(shù)的內(nèi)存空間;但是格式2在內(nèi)存分配成功后,同時(shí)將一初值存放到該內(nèi)存單元中;而格式3可同時(shí)分配若干個(gè)內(nèi)存單元,相當(dāng)于形成一個(gè)動(dòng)態(tài)數(shù)組。例如:
1)new int;??//開(kāi)辟一個(gè)存放整數(shù)的存儲(chǔ)空間,返回一個(gè)指向該存儲(chǔ)空間的地址。int *a = new int 即為將一個(gè)int類(lèi)型的地址賦值給整型指針a
2)int *a = new int(5) 作用同上,但是同時(shí)將整數(shù)空間賦值為5
2.開(kāi)辟數(shù)組空間
對(duì)于數(shù)組進(jìn)行動(dòng)態(tài)分配的格式為:
指針變量名=new 類(lèi)型名[下標(biāo)表達(dá)式];
delete [ ] 指向該數(shù)組的指針變量名;
兩式中的方括號(hào)是非常重要的,兩者必須配對(duì)使用,如果delete語(yǔ)句中少了方括號(hào),因編譯器認(rèn)為該指針是指向數(shù)組第一個(gè)元素的指針,會(huì)產(chǎn)生回收不徹底的問(wèn)題(只回收了第一個(gè)元素所占空間),加了方括號(hào)后就轉(zhuǎn)化為指向數(shù)組的指針,回收整個(gè)數(shù)組。
delete []的方括號(hào)中不需要填數(shù)組元素?cái)?shù),系統(tǒng)自知。即使寫(xiě)了,編譯器也忽略。
請(qǐng)注意“下標(biāo)表達(dá)式”不必是常量表達(dá)式,即它的值不必在編譯時(shí)確定,可以在運(yùn)行時(shí)確定。
一維: int *a = new int[100];????//開(kāi)辟一個(gè)大小為100的整型數(shù)組空間
二維: int **a = new int[5][6]
三維及其以上:依此類(lèi)推.
一般用法: new 類(lèi)型 (初值)
擴(kuò)展資料
c語(yǔ)言是一種結(jié)構(gòu)化語(yǔ)言,它有著清晰的層次,可按照模塊的方式對(duì)程序進(jìn)行編寫(xiě),十分有利于程序的調(diào)試,且c語(yǔ)言的處理和表現(xiàn)能力都非常的強(qiáng)大,依靠非常全面的運(yùn)算符和多樣的數(shù)據(jù)類(lèi)型,可以輕易完成各種數(shù)據(jù)結(jié)構(gòu)的構(gòu)建,通過(guò)指針類(lèi)型更可對(duì)內(nèi)存直接尋址以及對(duì)硬件進(jìn)行直接操作。
因此既能夠用于開(kāi)發(fā)系統(tǒng)程序,也可用于開(kāi)發(fā)應(yīng)用軟件。通過(guò)對(duì)C語(yǔ)言進(jìn)行研究分析,總結(jié)出其主要特點(diǎn)如下:
(1)簡(jiǎn)潔的語(yǔ)言
C語(yǔ)言包含有各種控制語(yǔ)句僅有9種,關(guān)鍵字也只有32 個(gè),程序的編寫(xiě)要求不嚴(yán)格且多以小寫(xiě)字母為主,對(duì)許多不必要的部分進(jìn)行了精簡(jiǎn)。
實(shí)際上,語(yǔ)句構(gòu)成與硬件有關(guān)聯(lián)的較少,且C語(yǔ)言本身不提供與硬件相關(guān)的輸入輸出、文件管理等功能,如需此類(lèi)功能,需要通過(guò)配合編譯系統(tǒng)所支持的各類(lèi)庫(kù)進(jìn)行編程,故c語(yǔ)言擁有非常簡(jiǎn)潔的編譯系統(tǒng)。
(2)具有結(jié)構(gòu)化的控制語(yǔ)句
C語(yǔ)言是一種結(jié)構(gòu)化的語(yǔ)言,提供的控制語(yǔ)句具有結(jié)構(gòu)化特征,如for語(yǔ)句、if?else語(yǔ)句和switch語(yǔ)句等。可以用于實(shí)現(xiàn)函數(shù)的邏輯控制,方便面向過(guò)程的程序設(shè)計(jì)。
(3)豐富的數(shù)據(jù)類(lèi)型
C語(yǔ)言包含的數(shù)據(jù)類(lèi)型廣泛,不僅包含有傳統(tǒng)的字符型、整型、浮點(diǎn)型、數(shù)組類(lèi)型等數(shù)據(jù)類(lèi)型,還具有其他編程語(yǔ)言所不具備的數(shù)據(jù)類(lèi)型,其中以指針類(lèi)型數(shù)據(jù)使用最為靈活,可以通過(guò)編程對(duì)各種數(shù)據(jù)結(jié)構(gòu)進(jìn)行計(jì)算。
(4)豐富的運(yùn)算符
c語(yǔ)言包含34個(gè)運(yùn)算符,它將賦值、括號(hào)等均視作運(yùn)算符來(lái)操作,使C程序的表達(dá)式類(lèi)型和運(yùn)算符類(lèi)型均非常豐富。
(5)可對(duì)物理地址進(jìn)行直接操作
C語(yǔ)言允許對(duì)硬件內(nèi)存地址進(jìn)行直接讀寫(xiě),以此可以實(shí)現(xiàn)匯編語(yǔ)言的主要功能,并可直接操作硬件。c語(yǔ)言不但具備高級(jí)語(yǔ)言所具有的良好特性,又包含了許多低級(jí)語(yǔ)言的優(yōu)勢(shì),故在系統(tǒng)軟件編程領(lǐng)域有著廣泛的應(yīng)用。
(6)代碼具有較好的可移植性
c語(yǔ)言是面向過(guò)程的編程語(yǔ)言,用戶(hù)只需要關(guān)注所被解決問(wèn)題的本身,而不需要花費(fèi)過(guò)多的精力去了解相關(guān)硬件,且針對(duì)不同的硬件環(huán)境。
在用C語(yǔ)言實(shí)現(xiàn)相同功能時(shí)的代碼基本一致,不需或僅需進(jìn)行少量改動(dòng)便可完成移植,這就意味著,對(duì)于一臺(tái)計(jì)算機(jī)編寫(xiě)的C程序可以在另一臺(tái)計(jì)算機(jī)上輕松地運(yùn)行,從而極大的減少了程序移植的工作強(qiáng)度。
(7)可生成的高質(zhì)量目標(biāo)代碼,高執(zhí)行效率的程序
與其他高級(jí)語(yǔ)言相比,C語(yǔ)言可以生成高質(zhì)量和高效率的目標(biāo)代碼,故通常應(yīng)用于對(duì)代碼質(zhì)量和執(zhí)行效率要求較高的嵌入式系統(tǒng)程序的編寫(xiě)。
參考資料來(lái)源:百度百科-C語(yǔ)言
必須使用malloc函數(shù),因?yàn)镃語(yǔ)言沒(méi)有new這個(gè)操作符,但是如果你的編譯器是C++的話(huà),是可以使用new的。
所以程序就是:
long *pNumber = (long*)malloc(sizeof(long) * 1000000);
開(kāi)辟后就可以像數(shù)組一樣使用它了,使用完后,一定要記得釋放它,用free,像這樣free(pNumber);使用new更方便。
代碼:
long* pNumber = new long[1000000];
使用完后,使用delete[]
像delete[] pNumnber;
擴(kuò)展資料:
總結(jié)C++中三種關(guān)于"new"的使用方法
其一是new operator,也叫new表達(dá)式;其二是operator new,也叫new操作符。這兩個(gè)英文名稱(chēng)起的也太絕了,很容易搞混,那就記中文名稱(chēng)吧。new表達(dá)式比較常見(jiàn),也最常用,例如:
string* ps = new string("abc");
上面這個(gè)new表達(dá)式完成了兩件事情:申請(qǐng)內(nèi)存和初始化對(duì)象。
new操作符類(lèi)似于C語(yǔ)言中的malloc,只是負(fù)責(zé)申請(qǐng)內(nèi)存,例如:void* buffer = operator new(sizeof(string));
注意這里多了一個(gè)operator。這是new的第二個(gè)用法,算比較常見(jiàn)。
第三個(gè)用法不常見(jiàn),它用于在給定的內(nèi)存中初始化對(duì)象,也就是說(shuō)你手中已有一塊閑置的內(nèi)存,例如:
void* buffer = operator new(sizeof(string));
//那么現(xiàn)在buffer是你所擁有閑置內(nèi)存的指針
buffer = new(buffer) string("abc"); //調(diào)用了placement new,在buffer所指向的內(nèi)存中初始化string類(lèi)型的對(duì)象,初始值是"abc"
事實(shí)上,placement new也是new表達(dá)式的一種,但是比普通的new表達(dá)式多了一個(gè)參數(shù),當(dāng)然完成的操作和返回值也不同。
因此上面new的第一種用法可以分解兩個(gè)動(dòng)作,分別為后面的兩種用法。
與new對(duì)應(yīng)的delete沒(méi)有三種語(yǔ)法,它只有兩種,分別是delete operator和operator delete,也稱(chēng)為delete表達(dá)式和delete操作符。delete表達(dá)式和new表達(dá)式對(duì)應(yīng),完成對(duì)象的析構(gòu)和內(nèi)存的釋放操作。而delete操作符只是用于內(nèi)存的釋放,和C語(yǔ)言中的free相似。例如:
string* ps = new string("abc");
...
delete ps; //調(diào)用delete表達(dá)式,先析構(gòu)再釋放
void* buffer = operator new(sizeof(string));
...
operator delete(buffer); //釋放
placement new是在指定位置初始化對(duì)象,也就是調(diào)用了構(gòu)造函數(shù),因此與之對(duì)應(yīng)的就是析構(gòu)函數(shù)了,只不過(guò)它不叫placement delete而已。
void *pv = operator new(sizeof(vectorint));
pv = new(pv) vectorint(8, 0);
...
static_castvectorint* (pv)-~vector(); // call destruct function
operator delete(pv); // free memory
pv = NULL;
C語(yǔ)言中沒(méi)有new函數(shù),但是有malloc函數(shù)
原型:? void *malloc(unsigned int size);
#includestdlib.h或#include malloc.h
malloc 向系統(tǒng)申請(qǐng)分配指定size個(gè)字節(jié)的內(nèi)存空間(連續(xù)的一塊內(nèi)存)。返回類(lèi)型是 void* 類(lèi)型。void* 表示未確定類(lèi)型的指針。
malloc 只管分配內(nèi)存,并不能對(duì)所得的內(nèi)存進(jìn)行初始化,所以得到的一片新內(nèi)存中,其值將是隨機(jī)的。
申請(qǐng)零字節(jié)內(nèi)存,函數(shù)并不返回NULL,而是返回一個(gè)正常的內(nèi)存地址,但是你卻無(wú)法使用這塊大小為0的內(nèi)存。
#include?stdio.h
#include?conio.h
int?main(void)
{
int?i,n;
char?*buffer;
printf("How?long?do?you?want?the?string??");
scanf("%d",i);
buffer=(char?*)malloc(i+1);
if?(buffer?==?NULL)
{
exit(1);
}
for?(n=0;ni;n++)
{
buffer[n]=rand()%26+'a';??/*generate?0-25?*/
}
buffer[i]='\0';
printf("Random?string?:%s\n",buffer);
free(buffer);
getch();
return?0;
}
c++中有new函數(shù)
new可用來(lái)生成動(dòng)態(tài)無(wú)名變量。
使用完動(dòng)態(tài)無(wú)名變量后應(yīng)該及時(shí)釋放,要用到 delete 運(yùn)算符。
int?*p=new?int?[10];?//動(dòng)態(tài)數(shù)組的大小可以是變量或常量;
網(wǎng)頁(yè)名稱(chēng):c語(yǔ)言new函數(shù) c語(yǔ)言new函數(shù)用法例子
網(wǎng)頁(yè)URL:http://chinadenli.net/article14/hppode.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、外貿(mào)網(wǎng)站建設(shè)、做網(wǎng)站、面包屑導(dǎo)航、搜索引擎優(yōu)化、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)