指針知識總結
一.指針
定義:指針用來保存、操作內存,解決系統堆棧空間的溢出問題,可更爲靈活的使用內存。
#地址是變量在內存中的編號,可用取地址符“&”來獲得變量的地址。
#指針可以保存地址。
#野指針:每個指針必須有對應的一個變量地址,若沒有就是一個野指針,其帶有損害。
#空指針:解決辦法是將指針初始化爲零。
#指針只能存儲、操作、運算與它類型相同的變量的地址。
#用指針訪問變量值:*p = i;
指針通過間接運算符“*”+指針變量“p”來訪問變量i的值。
int a=1;
int *p;
p = &a;
Cout<<*p;
#區分指針的地址、指針保存的地址和該地址的值。
#指針對數值的操作:間接訪問該值(即讀取該地址的數據),就可修改該數據(重新賦值)。
#更換指針保存的地址:改變指針的指向
*將一個變量的賦給另一個變量
int i =0;
int j =1;
i = j;
*可以將另一個變量的地址賦給已經保存了某個變量的地址的指針變量,如:
int i =10;
int j =20;
int *p=&i;
P=&j;
#爲什麼用指針?
指針的三大用途:
①.處理堆中存放的大型數據
②.快速訪問類的成員數據和函數
②.以別名的方式向函數傳遞參數
二.棧和堆
一般來說,寫程序就是與數據打交道,在執行程序某一功能的時候,將該功能所需要的數據加載到內存中,然後在執行完畢的時候釋放掉該內存。
#棧區——由編譯器自動分配並釋放,該區域一般存放函數的參數值,局部變量的值等。
#堆區——一般由程序員分配釋放,若程序員不釋放,程序結束時可能由操作系統回收。
#寄存器區——用來保存棧頂指針和指令指針。
#全局區(靜態區)——全局變量和靜態變量的存儲是放在一塊,程序結束後由系統自動釋放。
#文字常量區——常量字符串就是放在這裏的,程序結束後由系統自動釋放。
#程序代碼區——存放函數體的二進制碼。
#堆和棧的不同:
1.內存申請方式上的不同
2.系統響應的不同
3.空間大小的不同
4.執行效率的不同
⑴.棧 棧由系統自動分配,因此速度較快。但程序員不能對其進行操作。
⑵.堆 堆是由程序員分配內存,速度一般比較慢,而且容易產生內存碎片,不過用起來很方便。
5.執行函數時的不同
#用指針創建堆中空間
int *p;
P = new int;
等效於
int *p = new int;
#用指針刪除堆中空間
當程序結束作爲局部變量的指針自動消失後,計算機就再也找不到用new創建的內存了,就像丟失了這塊內存一樣,這種情況就是“內存泄露”。
因此如果不需要一塊內存空間,那麼就必須對其指針使用關鍵字delete。如:
int *p = new int;
delete p;
這樣釋放指針所指向的內存,而不會釋放指針。
int *p = new int; //新建一塊內存區域,用p指向它
delete p; //刪除指針指向的內存區域
p = 0; //置空指針
delete p; //再次刪除該指針就沒有危險
三.動態內存
#內存泄露:
int *p = new int;
p = new int;
假如沒有刪除一個指針就對其重新賦值,就會造成內存泄露。
正確方法一:
int *p = new int;
delete p;
p = new int;
方法二:不刪除第一塊內存空間,重新創建另開闢一塊。
int *p1 = new int;
int *p2 = new int;
#在堆中創建對象
Human *p;
P = new Human;
等效於:
Human *p = new Human;
#在堆中刪除對象
Human *p = new Human;
delete p;
#訪問堆中的數據成員
如果訪問對象的數據成員和函數,則使用 成員運算符“.” 。 如:
a.get( );
如果是在堆中創建的數據成員和函數,而該對象的內存地址保存在指針變量p中,如:
(*p).get( );
使用括號是爲了保證先使用*號讀取p的內存地址,然後再使用成員運算符來訪問成員函數get()。
但是這比較麻煩,故而在C++裏專有一個 成員指針運算符 “--->”,表示用指針來間接訪問對象的成員。如:
p ->get( );
#在構造函數中開闢內存空間
A::A{ i = new int(999);}
A::A{ delete i;}
#this指針
對象對自己成員的專屬標識。this變量記錄每個對象的內存地址,然後通過間接訪問運算符
->訪問該對象的成員。this -> i;
四.指針的運算
1.指針的自加減運算
int *p = new int;
p++;
p- -;
p=p-2;
2.指針的賦值運算
int *p = new int;
int *p1 = new int;
p=p1;
3.指針的相減運算(兩塊內存的地址差)
int *p = new int;
int *p1 = new int;
p=p1;
4.指針的比較運算
int *p = new int;
int *p1 = new int;
if (p=p1) //加入條件判斷語句
五.指針與常量
#常量指針
將指針聲明爲常量指針,即指針不可變。如:
int *const p;
但是它指向的整數是可以改變的。
#指向常量的指針
定義一個指向常量的指針,如:
const int *p;
該指針所指向的整數是不可修改的,但是該指針可被修改。
#指向常量的長指針
定義一個指向常量的常指針,如:
const int *const p;
那麼該指針指向的整數是不可修改的,並且該指針也不可以被修改。
(聲明:本文章是筆者學習範磊老師《C++全方位學習》中指針一章的學習提要,手動碼字。)