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代替
原文:https://www.cnblogs.com/cy2837/p/12203392.html