一.变量1.定义表示创建变量或分配储存单元。2.声明指的是说明变量的性质但不分配储存单元。3.局部变量函数中的变量是函数的私有变量或局部变量由于它们是在函数中声明的因此其他函数不能直接访问他们。局部变量之咋爱函数被调用时存在在函数执行完毕退出时消失。其他语言通常把这类变量称为自动变量”。4.外部变量所有函数中都可以通过变量名访问这种类型的变量。外部变量必须定义在所有函数之外。相比内部变量外部变量还具有更大的作用域和更长的生存期。外部变量的初始化只能出现在其定义中。二、作用域名字的作用域指的是程序中可以使用该名字的部分。对于在函数开头声明的自动变量来说其作用域是声明改变量名的函数。函数的参数可以将它看作局部变量。三、内存四区1、代码区程序运行期间只读内容由编译期决定运行中不可修改。修改逻辑必须重新编译。2、栈Stack存放局部变量、函数参数。由编译器自动分配和释放随函数调用而生随函数结束而灭。3、堆Heap通过 malloc/new 手动申请的内存。生命周期不受函数限制必须手动 free/delete否则造成内存泄漏。4.全局区存放全局变量、static 静态变量和字符串常量程序启动时分配、结束时由操作系统回收未显式初始化的变量会被自动置 0其中字符串常量位于只读段运行时不可修改。图进程内存全景手绘验证代码来自”黑马程序员“//全局区using namespace std; #includeiostream //全局变量 int g_a 10; int g_b 10; //const修饰的全局变量全局常量 const int c_g_a 10; const int c_g_b 10; int main() { //全局区 //全局变量、静态变量、常量 //创建普通局部变量 int a 0; int b 0; cout 局部变量a的地址为 a endl; cout 局部变量b的地址为 b endl; cout 全局变量g_a的地址为 g_a endl; cout 全局变量g_b的地址为 g_b endl; //静态变量 static int s_a 10; static int s_b 10; cout 静态变量s_b的地址为 s_a endl; cout 静态变量s_b的地址为 s_b endl; //常量 //字符串常量 cout 字符串常量的地址为 Icymemory endl; //const 修饰的变量 //const修饰的全局变量const修饰的局部变量 cout 全局常量c_g_a的地址为 c_g_a endl; cout 全局常量c_g_b的地址为 c_g_b endl; //const修饰的局部变量 const int c_l_a 10; //c-const,g-global,l-local const int c_l_b 10; cout 局部常量c_l_a的地址为 c_l_a endl; cout 局部常量c_l_b的地址为 c_l_b endl; system(pause); return 0; }//栈#includeiostream using namespace std; //栈区数据的注意事项----不要返回局部变量地址 //栈区的数据由编译器管理开票 int* func() { int a 10;//局部变量 存放在栈区栈区的数据在函数执行完后自动释放 return a;//返回局部变量的地址 } int main() { //接受func函数返回值 int* p func(); cout *p endl;//第一次可以打印正确的数字是因为编译器做了保留 cout *p endl;//第二次不再保留 system(pause); return 0; }//堆区 由程序员来分配释放若程序员不释放程序结束由操作系统回收//用new在堆区开辟内存#includeiostream using namespace std; //1、new基本语法 int* func() { //在堆区创建整形数据 //new返回是 该数据类型的指针 int* p new int(10); return p; } void test01() { int* p func(); cout *p endl; cout *p endl; cout *p endl; //堆区的数据由程序员开辟程序员管理释放 //如果想释放堆区数据delete delete p; //cout *p endl; //释放 } //2、堆区利用new开辟数组 void test02() { //创建10个整型数据的数组在堆区 int *arr new int[10]; for (int i 0; i 10; i) { arr[i] i 100; //给十个元素赋值 } for (int i 0; i 10; i) { cout arr[i] endl; } //释放堆区数组(要加[] delete[] arr; } int main() { //test01(); test02(); return 0; }四、命令执行函数/存储管理函数1.命令执行函数函数system(char*s)执行包含在字符串s中的命令然后继续执行当前程序。(例如system(pause);典型高危函数不建议使用)2.存储管理函数1函数malloc用于动态的分配存储块。函数声明void *malloc(size_t n)成功返回一个指针指向n字节长度的未初始化的存储空间失败返回NULL。2函数free(p)释放p指针指向的存储空间p是此前通过调用malloc函数得到的指针存储空间的释放顺序没有什么限制但是如果释放一个不是通过调用malloc函数得到的指针指向的存储空间将是一个很严重的错误。五、野指针民间说法未明确定义定义指向未知/无效/已释放内存的指针。建议使用前判断if(p ! NULL)三大成因1、未初始化int* p ;正确应该NULL(int* p NULL;)2、越界如规定的数组长度为10加了十一个元素。3、释放了没置空free(p);正确应该free(p); p NULL;对比代码#includestdio.h int main() { int* p;//野指针 printf(未初始化的指针地址%p\n,(void*)p); int a 10; p a; printf(好指针地址%p\n, (void*)p); return 0; }六、vector三指针1、三指针_Vector_base1_M_start 容器开始的位置2_M_finish 容器结束的位置3_M_end_of_storage 动态内存最后一个元素的下一个位置2、位置指针在栈上指向的内存在堆。3、释放空间1swap函数传入一个空容器vector立即释放2shrink_to_fit (C11vector容器的成员函数用于缩减容器的容量以匹配其当前大小从而释放多余内存4、总容量Size [_M_start,_M_finish)已使用内存Capacity [_M_start,_M_end_of_storage)5、扩容机制1寻找一块新内存(几何数增长如前一个是一就找一段二的内存)2将[_M_start,_M_finish)复制到新地址3原内存释放4更新三指针到新位置vector扩容