图解C++内存分布:
实例图解:
malloc与free:
#include#includeusing namespace std;int main(){ int a=20;//变量a存储在栈当中,使用完成后自动销毁 int *b=(int*)malloc(sizeof(int));//malloc动态在堆上面创建空间,返回指向这个空间的指针void*(指针类型不确定),所以这里需要强制类型转换! *b=50; cout<endl; //注意:malloc与free搭配使用 free(b);//动态内存需要手动释放,这里需要注意,释放的只是内存的使用权,并没有删除内存。 //验证:释放使用权后,内存不再受控,打印值为随机值,具体谁在使用这个内存计算机说了算! cout<endl; //验证:再次打印地址,发现地址与没有释放之前一致,再次说明释放的仅仅是使用权! cout<endl;}
后来有了new与delete:
#includeusing namespace std;int main(){ int a=20;//变量a存储在栈当中,使用完成后自动销毁 int *b=new int;//new操作符在堆上创建内存 *b=50; cout<endl; //注意:new与delete搭配使用 delete b;//动态内存需要手动释放,这里需要注意,释放的只是内存的使用权,并没有删除内存。 //验证:释放使用权后,内存不再受控,打印值为随机值,具体谁在使用这个内存计算机说了算! cout<endl; //验证:再次打印地址,发现地址与没有释放之前一致,再次说明释放的仅仅是使用权! cout<endl; //如果new出来的是一段空间 int *c=new int[10]; //释放时用的是delete [] delete [] c;}
聊一聊int* a[3]、int a[][3]、int(*a)[3]:
#include#includeusing namespace std;int main(){ /* 存储类型:A3_Pi 指针数组:里面保存的指针都是指向变量的地址 */ int* a[3]; cout<<typeid(a).name()<<endl; /* 存储类型:A2_A3_i 二维数组:对比第三种PA3_i理解 */ int b[][3]={1,2,3,4,5,6}; cout<<typeid(b).name()<<endl; /* 存储类型:PA3_i 数组指针:里面保存的指针都是指向有3个int型元素的数组 区分理解:c是指针变量,b是指针常量,可以c=b。 */ //第一种写法: //int (*c)[3]=b; //第二种写法: int (*c)[3]; c=b; cout<<typeid(c).name()<<endl; //new形式创建 // int (*c)[3]=new int[2][3];// cout<}