• C++入门学习4-指针与内存分配,引用


    指针与内存

    在C++中,一个指针必须在被分配内存之后,才能进行直接赋值的操作,如果没有进行内存的分配,直接对指针进行赋值,是会编译错误的,例如:

    int *p=123;   //这样是不可取的
    
    • 1

    我们平时常用的分配内存方式是分配【栈内存】,例如:

    int k=123;
    int *p=&k;  
    
    *p=345;
    cout<
    • 1
    • 2
    • 3
    • 4
    • 5

    因为123被放入了一个变量k中,系统为变量k分配了内存,指针p指向一个有内存空间的地址之后,就可以直接进行赋值了.

    动态分配内存:

    在系统中除了分配【栈内存】的方式外,还可以分配【堆内存】,分配方式如下:

    int *p=NULL;
    p=new int;                         //分配堆内存
    *p=123;                            //分配了内存之后,就可以直接进行赋值操作了
    
    • 1
    • 2
    • 3

    函数中的堆内存/栈内存

    申请堆内存后,系统不会在程序执行时依据情况自动销毁,若想要释放堆内存空间,必须使用delete关键字;例如,定义两个函数,返回类型都是指针类型,但是一个分配堆内存,一个分配栈内存,在函数结束之后,虽然两个指针都得到了正确的地址,但是被分配
    栈内存的指针的内容会被销毁,程序会自行销毁在函数中分配的栈内存,但是不会自行销毁在函数中的堆内存,所以函数执行结束后,要用delete关键字销毁

    int *p=NULL;
    p=newPointer(p);   //返回指针类型的函数,并且分配堆内存
    delete p;          //销毁堆内存
    
    • 1
    • 2
    • 3

    不能对已经销毁的内存赋值
    如果一个函数是一个返回指针类型的函数,并且分配栈内存,那么在函数结束后,该指针指向的地址会被摧毁,如果此时仍然对该地址的内容进行赋值操作,更改已经被销毁的内容的数据,会造成一些奇怪的结果,赋值操作不会稳定。可能赋值上了,也可能刚赋值上之后又变成一个随机数

    内存丢失
    对一个指针申请动态内存之后,如果改变它的指向,那么之前申请的内存就会变得不可用
    ,并且无法回收,造成内存泄漏,例如:

    int *p=NULL;
    p=new int;        //申请动态内存
    *p=123;
    
    int k=345;
    *p=&k;              //改变p的指向,那么之前申请的内存就不可用了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    内存销毁时,需要保留指向该内存的指针,当没有指针指向一块没被回收的堆内存时,此块内存就如同丢失,成为内存泄漏


    如果,接下来的代码不再使用该动态内存,可以选择对其回收

    #include
    using namespace std;
    void swap(int *a,int *b)
    {
        int temp=*a;
        *a=*b;
        *b=temp;
    }
    int main()
    {
        int *p=new int;
        *p=3;
        int k=5;
    
        cout<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    delete p;
    p=NULL;     //先回收动态内存,再将p置空防止调用内存
    
    • 1
    • 2

    引用:

    引用其实就是相当于给变量一个代称,对代称进行相关的操作等同于对本体进行操作.
    左值引用

    int &a=x;
    
    • 1

    右值引用

    int &&a=get();
    
    • 1

    左值引用与右值引用
    1.一个引用在被初始化后,无法用它去引用其他的对象.
    2.左值引用用来引用变量;而右值引用用来引用临时变量(函数的返回值),并且无法改变.
    3.在定义时必须进行初始化.

    用引用传递参数/用指针传递参数

    引用传参

    void swap(int &a,int &b)
    {
         int temp=a;
         a=b;
         b=temp;
    } 
    swap(x,y);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    指针传参

    void swap(int *a,int *b)
    {
         int temp=*a;
         *a=*b;
         *b=temp;
    }
    swap(&x,&y);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    main函数

    main(int argc,char *argv[])
    
    • 1

    main函数中的参数可以获取程序运行的命令参数
    用数组作为函数的参数,其中:
    argc可以获取命令参数的个数;
    argv[]可以获取具体的命令参数(/a /b /c)

  • 相关阅读:
    【Python】【OpenCV】关于cv2.findContours()轮廓索引(编号)解析(RETR_TREE)
    产品推荐 | 基于XILINX K7 XC7K325T的PCIe_CameraLink图像模拟源
    高速数字化仪和AWG在车辆总线(CAN/LIN/PSI5)测试中的应用(二)
    VI/VIM的使用
    PHP调用API接口的方法及实现(内附电商平台商品详情接口案例)
    云小课|MRS基础原理之CarbonData入门
    JVM源码解析
    大龄程序员如何面对“中年危机”?这份书单或许能帮到你
    站群服务器 CentOS 搭建socks5多IP代理服务器详细教程,12个步骤教会你!
    jq实现多页展示并且进度条轮播
  • 原文地址:https://blog.csdn.net/qq_52508038/article/details/127748802