指針是用來保存內存地址的變量。每個被定義的變量都有自己的地址,可以用指針來存放任何被定義的變量的地址。如(p存放的是變量的地址,*p存放的是變量的數據。):
inta;//定義一個整型變量a int*p;//定義一個指向整型變量的指針p p=&a;//將變量a的地址賦給變量p
定義一個指針后一定要用它保存一個內存地址,如果不那么做的話,那么該指針就是一個失控指針,它可以指向任何地址,并且對該地址的數值進行修改或者刪除,可能會造成意想不到的后果。所以,可以將指針初始化為0,如:
int*p;p=0;或者int*p=0;
由于不同類型的變量在內存中所占用的字節不同,而指針又是用來保存內存地址的變量,因此指針只能存儲與它類型相同的變量的地址。
注意區分指針地址、指針保存的地址和該地址的值,如:
inta=1; int*p=&a; cout<"指針地址:"?<&p?<
為什么使用指針?因為在操作大型數據和類時,指針可以通過內存地址直接訪問數據,可避免在程序中復制大量的代碼,因此指針的效率最高。一般來說,指針會有3大用途:
(1)處理堆中存放的大型數據;
(2)快速訪問類的成員數據和函數;
(3)以別名的方式向函數傳遞參數。
如何使用堆?首先創建一個堆,然后定義一個指向該堆的指針,最后通過該指針就可以訪問堆中的數據。在C++中使用關鍵字new創建一個堆并分配內存,在new后面跟一個要分配的對象類型,編譯器根據這個類型來分配內存。如:
int*p;p=newint;或int*p=newint;//分配了四個字節的內存空間
由于使用new創建的內存空間不會被系統自動釋放,因此假如不去釋放它,那么該區域的內存將始終不能為其他數據所使用,而指向該內存的指針是個局部變量,當定義該指針的函數結束并返回時,指針也就消失了,從而再也找不到這塊內存區域,這種情況叫做內存泄漏。因此,當不需要一塊內存空間,可以使用關鍵字delete釋放該內存空間(不要再次對該指針進行刪除,因為它所指向的內存區域已經被釋放,如果再進行釋放,將會使程序崩潰。但是,如果將該指針賦為0的話,那么刪除一個指針是安全的。),但不會釋放該指針,指針可以繼續使用。另外,當用delete釋放一個指針所指向的空間后,最好將該指針的內存地址清0。如:
int*p=newint; deletep; p=0;
還可以在堆中創建對象(創建對象時會自動調用類的構造函數來初始化對象的成員數據),如下,定義了一個Human類的指針p,指向new創建的內存空間。占用內存大小由Human類對象的成員變量來決定。
Human*p;p=newHuman;或Human*p=newHuman;
如果要刪除在堆中創建的對象,可以直接刪除指向該對象的指針,這樣會自動調用對象的析構函數來銷毀該對象,同時釋放內存。
可以通過指針變量訪問堆中創建的對象,如下,其中->是成員指針運算符,利用該符號可以實現讀取對象的內存地址并且訪問該對象的成員的作用。
(*p).get();或p->get();
指針可以進行加減操作,如下,定義了一個指針并指向int型變量,執行加1操作,會將原來的內存地址增加4個字節;執行減1操作,會將原來的內存地址減少4個字節。
int*p=newint; p++; p--;
常量指針是指該指針不可改變,但其指向的數據可改變,如下:
int*constp;
指向常量的指針是指該指針可改變,但其指向的數據不可改變,如下:
constint*p;
指向常量的常指針是指該指針不可變,其指向的數據也不可變,如下:
constint*constp;
-
指針
+關注
關注
1文章
481瀏覽量
70609 -
C++
+關注
關注
22文章
2114瀏覽量
73857 -
編譯器
+關注
關注
1文章
1642瀏覽量
49286
原文標題:【博文連載】C++中的“指針”
文章出處:【微信號:ChinaAET,微信公眾號:電子技術應用ChinaAET】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論