在C中,通常使用如下格式
int *ptr;
這里強調(diào)*ptr是一個int類型的值,而很多C++程序員使用如下格式;
int* ptr
這里強調(diào)int*是一種指向int的指針。不過在哪里添加空格對編譯器來說沒有區(qū)別。
2、使用new分配內(nèi)存
在C語言中,可以使用來分配內(nèi)存,在C++中仍然可以,不過C++提供了一種更好的方法——new運算符
int* pn=new int;
new int告訴程序,需要一塊適合存儲int類型的空間,內(nèi)存空間開辟后返回這塊空間的地址給pn。這種只能通過指針訪問
int higgens;
int* pt=&higgens;
這種則可以通過或指針進(jìn)行訪問
3、使用釋放內(nèi)存
用于釋放使用后的內(nèi)存(最初只能是由new分配的),使用格式如下:
int* ps=new int;
...
delete ps;
這將釋放ps指向的內(nèi)存,不過不會刪除ps指針,依舊可以使用ps去指向另外新分配的內(nèi)存
4、使用new來創(chuàng)建動態(tài)數(shù)組
以傳統(tǒng)方式聲明數(shù)組,程序在編譯的時候就會給數(shù)組分配內(nèi)存空間(靜態(tài)聯(lián)編),而使用new,則是在運行階段,需要數(shù)組才創(chuàng)建它(動態(tài)聯(lián)編)
(1)創(chuàng)建、釋放動態(tài)數(shù)組
為數(shù)組分配內(nèi)存和釋放內(nèi)存的通用格式如下:
type_name * pointer_name=new type_name[num_elements];
...
delete[] pointer_name;
如:
int * psome=new int[10];
...

delete[] posome
(2)使用動態(tài)數(shù)組
可以像數(shù)組一樣使用動態(tài)數(shù)組
int * psome=new int [10];
psome[0]=2;//賦值
psome[1]=3;
不過使用指針和數(shù)組名之間有根本差別
#include
#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
using namespace std;
double * p3=new double [3];
p3[0]=0.2;
p3[1]=0.5;
p3[2]=0.8;
cout <<"P3[1] is "<
例如這個例子,在經(jīng)過p3=p3+1后,p3[0]變成p3[1]了,這是由于p3是指針變量,加1后可以指向下一個地址,不過數(shù)組名不可以這么使用
使用動態(tài)數(shù)組可以節(jié)省內(nèi)存空間,另外,new和還可以用于字符串,同樣起節(jié)省內(nèi)存空間的作用
#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
char * getname(void);
int main(int argc, char** argv) {
char * name;
//輸出存儲內(nèi)容、地址、字節(jié)數(shù)
name=getname();
cout<>temp;
char * pn=new char[strlen(temp)+1];//創(chuàng)建比輸入字節(jié)多1(保存'\0')的內(nèi)存空間1
strcpy(pn,temp);

return pn;
}
八、指針、數(shù)組和指針?biāo)阈g(shù)
關(guān)于指針的使用、指針與數(shù)組、字符串的關(guān)系以及指針?biāo)阈g(shù)可以觀看我前面關(guān)于C語言指針的文章,使用方法基本一致,此外書籍在這里還陳述了如何使用new創(chuàng)建動態(tài)結(jié)構(gòu)以及自動存儲、靜態(tài)存儲,動態(tài)存儲。
1、使用new創(chuàng)建動態(tài)結(jié)構(gòu)
在運行時創(chuàng)建數(shù)組優(yōu)于在編譯時創(chuàng)建數(shù)組,對于結(jié)構(gòu)也是如此。需要在程序運行時為結(jié)構(gòu)分配所需的空間,這也可以使用 new 運算符來完成。通過使用 new,可以創(chuàng)建動態(tài)結(jié)構(gòu)。同樣,“動態(tài)”意味著內(nèi)存是在運行時,而不是編譯時分配的。由于類與結(jié)構(gòu)非常相似,因此本節(jié)介紹的有關(guān)結(jié)構(gòu)的技術(shù)也適用于類.
將new 用于結(jié)構(gòu)由兩步組成:創(chuàng)建結(jié)構(gòu)和訪問其成員。要創(chuàng)建結(jié)構(gòu),需要同時使用結(jié)構(gòu)類型和 new。例如,要創(chuàng)建一個未命名的 類型,并將其地址賦給一個指針,可以這樣做:
inflatable * ps = new inflatable;
這將把足以存儲 結(jié)構(gòu)的一塊可用內(nèi)存的地址賦給 ps。這種句法和 C的內(nèi)置類型完全相同。
比較棘手的一步是訪問成員。創(chuàng)建動態(tài)結(jié)構(gòu)時,不能將成員運算符句點用于結(jié)構(gòu)名,因為這種結(jié)構(gòu)沒有名稱,只是知道它的地址。C++專門為這種情況提供了一個運算符:箭頭成員運算符(->)。該運算符由連字符和大于號組成,可用于指向結(jié)構(gòu)的指針,就像點運算符可用于結(jié)構(gòu)名一樣。例如,如果 ps 指向一個 結(jié)構(gòu),則ps->price 是被指向的結(jié)構(gòu)的 price 成員。另外,還可以使用(*ps).price訪問結(jié)構(gòu)成員。*ps即被指向的結(jié)構(gòu)本身。
使用一個例子來應(yīng)用動態(tài)結(jié)構(gòu)
#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
struct inflatable
{
char name[20];
float volume;
double price;
};//創(chuàng)建結(jié)構(gòu)體
int main(int argc, char** argv) {
inflatable * ps=new inflatable;
cout<<"Enter name of inflatable item:";

cin.get(ps->name,20);//cin.get()用于輸入整行字符串
cout<<"Enter volume in cubic feet:";
cin>>(*ps).volume;
cout<<"Enter price:";
cin>>ps->price;
cout<<"name: "<<(*ps).name<volume<<" cubic feet\n";
cout<<"price: "<price<
2、自動存儲、靜態(tài)存儲和動態(tài)存儲
根據(jù)用于分配內(nèi)存的方法,C++有3 種管理數(shù)據(jù)內(nèi)存的方式:自動存儲、靜態(tài)存儲和動態(tài)存儲(有時也叫作自由存儲空間或堆)。在存在時間的長短方面,以這3 種方式分配的數(shù)據(jù)對象各不相同。下面簡要地介紹每種類型(C++11還新增了第四種類型一一線程存儲)。
(1)自動存儲
在函數(shù)內(nèi)部定義的常規(guī)變量使用自動存儲空間,被稱為自動變量( ),這意味著它們在所屬的函數(shù)被調(diào)用時自動產(chǎn)生,在該函數(shù)結(jié)束時消亡。
實際上,自動變量是一個局部變量,其作用域為包含它的代碼塊。代碼塊是被包含在花括號中的一段代碼。代碼塊不止是整個函數(shù)。函數(shù)內(nèi)也可以有代碼塊。如果在其中的某個代碼塊定義了一個變量,則該變量僅在程序執(zhí)行該代碼塊中的代碼時存在。
自動變量通常存儲在棧中。這意味著執(zhí)行代碼塊時,其中的變量將依次加入到棧中,而在離開代碼塊時,將按相反的順序釋放這些變量,這被稱為后進(jìn)先出(LIFO)。因此,在程序執(zhí)行過程中,棧將不斷地增大和縮小。
(2)靜態(tài)存儲
靜態(tài)存儲是整個程序執(zhí)行期間都存在的存儲方式。使變量成為靜態(tài)的方式有兩種:一種是在函數(shù)外面定義它;另一種是在聲明變量時使用關(guān)鍵字:
fee =56.50;
在K&RC中,只能初始化靜態(tài)數(shù)組和靜態(tài)結(jié)構(gòu),而C+.0(及后續(xù)版本)和ANSIC中也可以初始化自動數(shù)組和自動結(jié)構(gòu)。然而,一些您可能已經(jīng)發(fā)現(xiàn),有些 C++實現(xiàn)還不支持對自動數(shù)組和自動結(jié)構(gòu)的初始化。
(3)動態(tài)存儲
new和運算符提供了一種比自動變量和靜態(tài)變量更靈活的方法。它們管理了一個內(nèi)存池,這在C++中被稱為自由存儲空間(free store)或堆(heap)。該內(nèi)存池同用于靜態(tài)變量和自動變量的內(nèi)存是分開的。new和 讓您能夠在一個函數(shù)中分配內(nèi)存,而在另一個函數(shù)中釋放它。因此,數(shù)據(jù)的生命周期不完全受程序或函數(shù)的生存時間控制。與使用常規(guī)變量相比,使用new和讓程序員對程序如何使用內(nèi)存有更大的控制權(quán)。然而復(fù)合數(shù)字對象格式是指,內(nèi)存管理也更復(fù)雜了。在棧中復(fù)合數(shù)字對象格式是指,自動添加和刪除機(jī)制使得占用的內(nèi)存總是連續(xù)的,但new和的相互影響可能導(dǎo)致占用的自由存儲區(qū)不連續(xù),這使得跟蹤新分配內(nèi)存的位置更困難。
九、數(shù)組替代品 1、模板類
模板類 類似于 類,也是一種動態(tài)數(shù)組。可以在運行階段設(shè)置 對象的長度,可在末尾附加新數(shù)據(jù),還可在中間插入新數(shù)據(jù)。基本上,它是使用 new 創(chuàng)建動態(tài)數(shù)組的替代品。實際上,類確實使用new.和 來管理內(nèi)存,但這種工作是自動完成的。
使用有一些注意事項:
①要使用 對象,必須包含頭文件 。
② 包含在名稱空間 std 中,可使用using 編譯指令using聲明或std:。
③模板使用不同的語法來指出它存儲的數(shù)據(jù)類型。
④ 類使用不同的語法來指定元素數(shù)。
下面是一些示例:
#include
...
using namespace std;
vector vi;
int n;
cin>>n;
vector va(n);
其中,vi是一個 對象,vd 是一個 對象。由于 對象插入或添加值時自動調(diào)整長度,因此可以將 vi的初始長度設(shè)置為零。但要調(diào)整長度,需要使用 包中的各種方法。一般而言,下面的聲明創(chuàng)建一個名為 vt 的 對象,它可存儲 個類型為 的元素
vector vt(n_elem);
其中參數(shù) 可以是整型常量,也可以是整型變量。
2、模板類array(C++11)
類的功能比數(shù)組強大,但付出的代價是效率稍低。如果需要的是長度固定的數(shù)組,使用數(shù)組是更佳的選擇,但代價是不那么方便和安全。有鑒于此,C+11新增了模板類 array,它也位于名稱空間std中。與數(shù)組一樣,array 對象的長度也是固定的,也使用棧(靜態(tài)內(nèi)存分配),而不是自由存儲區(qū),因此效率與數(shù)組相同,但更方便,更安全。要創(chuàng)建array對象,需要包含頭文件 array。array 對象的創(chuàng)建語法 稍有不同
#include
...
using namespace std;
array ai;
array ad={1.1,1.2,2.3,3.4};
推而廣之,聲明創(chuàng)建一個名為 arr 的array 對象,它包含 個類型為 的元素:
array arr;
與創(chuàng)建對象不同,不能是變量
3、比較數(shù)組、對象和array對象
①無論是數(shù)組、 對象還是 array 對象,都可使用標(biāo)準(zhǔn)數(shù)組表示法來訪問各個元素。
②array對象和數(shù)組存儲在相同的內(nèi)存區(qū)域(即棧)中而 對象存儲在另一個區(qū)域(自由存儲區(qū)或堆)中。
③可以將一個amay 對象賦給另一個array對象;而對于數(shù)組,必須逐元素復(fù)制數(shù)據(jù)。
C++的學(xué)習(xí)筆記持續(xù)更新中~
要是文章有幫助的話,就點贊收藏關(guān)注一下啦!
感謝大家的觀看
歡迎大家提出問題并指正~