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;
}
结果图: