首页 > 其他 > 详细

课时5:范围for、动态内存分配、nullptr

时间:2020-01-16 23:16:22      阅读:68      评论:0      收藏:0      [点我收藏+]

1.范围for
int arr1(){1,2,3,4,5,6,7};
for(auto x:arr1)
cout<<x<<endl;

int arr2(){2,2,3,1,3,4,2}
for(auto &x:arr2)
cout<<x<<endl;


2.动态内存分配问题
C++中,把内存详细分为5个区域:
栈:函数内的局部变量会放在这里,由编译器自动分配和释放
堆:程序员用malloc\new来分配,用free\delete来释放,忘记释放后,系统会回收
全局、静态变量存储区:放全局变量和静态变量static,程序结束时系统释放
常量存储区:
程序代码区:

//堆和栈的用途和区别
栈:空间是有限的,分配速度快
堆:只要不超出实际拥有的物理内存,也在操作系统允许能够分配的最大内存大小之内,都可以分配
分配速度比栈慢,可以随时使用malloc\new来分配,使用free\delete来释放,非常灵活。

//malloc和free:malloc和free用来从堆中分配和释放内存用。malloc和free()是函数
//malloc(memory allocation):动态内存分配

//一般形式:
void *malloc(int NumBytes)://NumBytes:要分配的字节数,分配成功则返回指向指向被分配内存的指针,分配失败则返回NULL
//free:
void free(void *FirstByte):将之前用malloc分配的内存空间还给程序(操作系统),也就是说释放了这块内存。这块内存被系统回收,并在需要的时候有序通分配出去

int *p =NULL;
p = malloc(sizeof(int)); //在堆中分配4个字节
if(p!=NULL){
//分配成功
*p = 5;
cout<<*p<<endl;
free(p); //释放堆内存
}

char *point = NULL;
point = (char *)malloc(100 * sizeof(char))
if(point != NULL)
{
strcpy_s(point,100,"hello,world"); //strcpy_s函数: 字符串拷贝
cout<<point<<endl;
}

-----------------------------------

int *p = (int *)malloc(100*sizeof(int)); //先分配一块区域,然后用指针去使用这一块空间
if(p != NULL){

int *q = p;
*q++ = 1;
*q++ = 5;
cout<<*p<<endl;
cout<<*(p+1)<<endl;
free(p);

}

------------------------------------
//new和delete:是运算符(标识符),C++中用new和delete来分配和释放内存,不再使用malloc和free来分配和释放内存
//new,delete比malloc,free更强大
new一般使用格式:
指针变量名 = new 类型标识符
指针类型名 = new 类型标识符(初始值);
指针类型名 = new 类型标识符[内存单元个数];

int *myint = new int; //
if(myint !=NULL){

*myint = 8;
cout<<*myint<<endl;
delete myint; //释放单个myint的空间

}

-------------------------------
int *p = new int(18);
cout<<*p<<endl;
delete p;
-------------------------------
int *pa = new int[100];
if(pa != NULL){

int *pb = pa;
*pb++ = 10;
*pb++ = 20;
cout<<*pa<<endl;
cout<<*(pa+1)<<endl;

}

3.nullptr:代表的是空指针,C++11引入的新关键字,为了避免整数和指针混淆

char *p = NULL; //NULL实际是0
char *q = nullptr;
char *p = nullptr;

if(p == nullptr){
cout<<"nullptr==NULL"<<endl;
}

//比较NULL和nullptr
typeid(NULL).name()
typeid(nullptr).name()
结论:对于指针的初始化,以往用到的和指针有关的NULL的场合,全部使用nullpotr代替

课时5:范围for、动态内存分配、nullptr

原文:https://www.cnblogs.com/cy2837/p/12203392.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!