1 内存分区模型
代码区:所有的代码都会放这里
全局区:
栈:由编译器管理内存的分配和释放
堆:由程序员分配和释放
代码区和全局区都是程序运行前分配的两个区域
全局区:全局变量、静态变量、常量(const)
只要没有写到函数体中的都是全局变量
static静态变量也会放到全局区
常量:
字符串常量:双引号引起来的都是字符串常量
const修饰变量
const修饰全局变量:全局常量。全局区存放。
const修饰局部变量:不在全局区,跟局部变量一样存放在栈用
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
#include<iostream> using namespace std; // 栈区数据的注意事项:不要返回局部变量的地址 // 栈区的数据由编译器管理开辟和释放 int* func(int b) { b = 100; // 形参数据也会存放在栈区 int a = 10; // 局部变量:存放在栈区,栈区的数据在函数执行完后自动释放 return &a; // 返回局部变量的地址 } int main() { int* p = func(1); cout << *p << endl; // 输出的结果是乱码,反正不是我们想要的 }
#include<iostream> using namespace std; // 在堆区开辟数据 // int* func() { // 指针本质是局部变量,指针保存的数据存放在堆区 int* a = new int(10); // 利用new关键字,在堆区开辟数据,把地址返回给你 return a; } int main() { int* p = func(); cout << *p << endl; }
#include<iostream> using namespace std; // 1.new的基本语法 int* func() { // 在堆区创建整型数据 // 返回的是该数据类型的指针 int *p = new int(10); } void test01() { int* p = func(); cout << *p << endl; delete p; // 释放内存 } // 2.在堆区利用new开辟一个数组 void test02() { // 创建10个整型数据的数组 int * arr = new int[10]; // 中括号,创建数组,10代表数据有十个函数 for (int i = 0; i < 10; i++) { arr[i] = i + 100; // 给数组元素赋值 } // 释放 delete[] arr; // 释放数组得加一个数组才可以,告诉编译器我要释放一个连续空间 } int main() { test01(); return 0; }