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;
}

 

posted @ 2021-01-15 14:04  不妨不妨,来日方长  阅读(104)  评论(0编辑  收藏  举报