C++堆指針棧指針
指針是一種靈活高效的內存訪問機制。
按有無申請動態分配的方式,分爲兩種類別:堆指針、棧指針。
在程序中定義一個變量,它的值會被放入內存中。
如果申請使用動態分配,它的值將放到堆中。
如果沒有申請動態分配,它的值將放到棧中。
tips:前提是定義了一個空指針。
1、創建堆指針:
申請動態分配使用關鍵字new。
p=new type;
其中,p表示指針,new是關鍵字,type是類型名。
new返回新分配的內存單元的地址。
指針函數:
int *GetHeapsPoint(int *p){
p=new int; //申請動態分配,令指針指向某個int型
int k1=111;
*p=k1; //指向k1
return p;
}
可以看到指針p創建後申請了動態分配,程序自動交給他一塊堆地址。
2、創建棧指針:
指針函數:
int *GetStackPoint(int *i){
int k2=222;
i=&k2;
//無動態分配,直接指向k2的地址
return i;
}
可以看到指針i則是獲取了棧中k2的地址,屬於靜態分配。
3、動態內存的銷燬:
動態分配方式雖然靈活,但是隨之帶來新的問題。申請一塊堆內存後,系統不會再程序執行時依據情況自動銷燬它。
若想釋放該內存,則需要使用delete關鍵字。
delete p;
三位一體源代碼:
#include<iostream>
using namespace std;
int *GetHeapsPoint(int *p){
p=new int; //申請動態分配,令指針指向某個int型
int k1=111;
*p=k1; //指向k1
return p;
}
int *GetStackPoint(int *i){
int k2=222;
i=&k2;
//無動態分配,直接指向k2的地址
return i;
}
int main(){
int *p=NULL;
p=GetHeapsPoint(p);
cout<<"堆指針*p="<<*p<<" 地址爲:"<<p<<endl;
int *i=NULL;
i=GetStackPoint(i);
cout<<"棧指針*i="<<*i<<" 地址爲:"<<i<<endl;
delete p;
cout<<"內存銷燬後堆指針*p="<<*p<<" 地址爲:"<<p<<endl;
return 0;
}
結果圖: