for语句
int v[] {12, 13, 15, 17};
for (auto x:v){
cout << x << endl;
}
//-----------------------------------------------------------
for (auto x:{12, 13, 15, 17}){
cout << x << endl;
}
//-----------------------------------------------------------
int v[] {12, 13, 15, 17};
for (auto &x:v){ //&x可以直接操作数组中的元素,省去了拷贝动作
cout << x << endl;
}
1、visual studio 快捷键:加断点f9、运行调试f5、执行下一步f10、查看变量shift+f9
动态内存分配问题:
程序使用的存储空间:
C中程序区、静态存储区、动态存储区。
C++中我们把内存分为5个区:
①栈:一般函数内的局部变量都会放在这里,由编译器自动分配和释放。
②堆:程序员malloc/new分配,用free/delete来释放。忘记释放后,系统会回收(在程序结束时,系统才会回收)。
③全局/静态存储区:全局变量和静态变量static。程序结束时系统释放。
④常量存储区:“I Love China”
⑤代码区:
栈和堆的区别:
①栈:空间有限。系统规定 int a = 4;分配速度快,程序员无法控制。
class A {
};
int main(){
A a; //这个变量的内存分配再栈上
}
②堆:只要不超出实际拥有的物理内存,也在操作系统允许你能够分配的内存大小之内,都可以分配给你。
分配速度较慢,可以随时用new/malloc来分配,free/delete来释放,非常灵活。
在C中使用malloc与free,malloc()与free()是函数
一般形式:
class A {
};
int main(){
A pa = new A(); //这个变量的内存分配再堆上
}
malloc(memory allocation)
void *malloc(int NumBytes) //void * 表示万能的指针,NumBytes表示要分配的字节数。
//若分配成功则返回被分配的内存指针,分配失败则返回NULL。
//当这段分配的内存不适用时,应使用free()函数来释放,供其他地方
//使用
void free(void *FirstByte) //将之前malloc分配的内存空间还给程序,也就是释放了这块内存,这
//这样内存就被系统回收,并在需要的时候有系统分配出去再给其它释
//放
//-----------------------------------------------------------------------------
int *p = NULL; //C语言写法
p = (int *)malloc(sizeof(int)); //正常情况下malloc()返回的是一个(void *)的指针,所以在赋
//给p时需要强制转换一下
if(p != NULL){
//分配成功
*p = 5;
cout << *p << endl;
free(p);
}
//--------------------------------------------------------------------------
int *p = NULL; //C语言写法
p = (int *)malloc(sizeof(int) * 100); //正常情况下malloc()返回的是一个(void *)的指
//针,所以在赋
//给p时需要强制转换一下
if(p != NULL){
//分配成功
int *q = p;
*q++ = 1; //相当于*(q++); 即:*q = 1 , q++ 因为q是整型,所以q+1相当于q指针从首地址
//向后移动4个字节
*q++ = 5;
cout << *p << endl;
free(p);
}
//---------------------------------------------------------------------------
char *point = NULL;
point = (char *)malloc(100 * sizeof(char))
if (point != NULL){
strcpy(point, "hello world!"); //当要拷贝的字符串超过point所指向的空间时不会报警,会
//继续覆盖掉超出范围的部分
strcpy_s(point, 100, "hello world!"); //第二个参数用来指定,要拷贝字符串所能占用的最
//大空间,超出空间后会报警
cout << point << endl;
free(point);
}
C++中使用new与delete
new与delete是标识符,C++中使用new/delete分配和释放内存,不再使用malloc和free分配和释放内存。除了分配和释放内存,new和delete还干了更多的事情。
new的一般使用格式:
①指针变量名 = new 类型标识符;
②指针类型名 = new 类型标识符 (初始值);
③指针类型名 = new 类型标识符 [内存单元个数];
int *myint = new int; //相当于int *p = (int *)malloc(sizeof(int));
if (myint != nullptr){
*myint = 8;
cout << *myint << endl; //输出8
delete myint;
}
//-------------------------------------------------------------------
int *myint = new int(18);
if (myint != nullptr){
cout << *myint << endl; //输出18
delete myint;
}
//------------------------------------------------------------------
int *pa = new int[100];
if(!pa != nullptr){
int *q = pa;
*q++ = 12;
*q++ = 18;
cout << *pa << endl; //12
cout << *(pa+1) << endl; //18
delete[] pa; //new的时候用了[],那么释放的时候就必须用[],[]不写数组大小
}
补充:
①配对使用有new必然有delete;
②free/delete不要重复调用;
nullptr代表空指针
char *p = NULL; //NULL实际就是0
char *q = nullptr;
int a = nullptr; //不可以
int b = NULL; //可以
if(p == nullptr){
//成立
}
if(q == NULL){
//成立
}
//使用nullptr能够避免在整数和指针之间发生混淆
cout << typeid(NULL).name() << endl; // int
cout << typeid(nullptr).name() << endl; // std::nullptr t