• 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;
    }
  • 相关阅读:
    最近想读的书想做的事
    syslogng 正确配置udp接受端口
    (转)iPhone重绘机制drawRect
    .Net工具整理
    用系统的网格还是用自己的网格
    将主关键字加强为适应多个
    onblur与onbeforedeactivate的区别
    模式窗口中无法转向
    实现获取客户端的MAC地址(3)
    onkeypress、onkeydown、onkeyup三事件的区别
  • 原文地址:https://www.cnblogs.com/masbay/p/14281726.html
Copyright © 2020-2023  润新知