• c++ 指针,new运算符


    1、指针相关基础知识:

    1.1、指针一般指向变量的地址,等同于变量名前加&,如下:

    1. int a = 3;
    2. int* p;
    3. p = &a;

     1.2、 * 符号被称为间接值运算符或解除引用运算符,将其运用于指针,可以获取指针指向的值。

    1. if (*p == a)
    2. cout << "*p == a" << endl;

    结果:

    定义指针的两种方式:

    1. int a = 3;
    2. 方法1int* p = &a;
    3. 方法2int* p;
    4. p = &a;

     1.3、指针的错误用法,在定义指针后,直接将指针指向具体的值或字符,如:

    1. int *p;
    2. *p = 2;

     由于创建指针时,计算机只会给指针分配储存地址的空间,而不会分配指针指向的数据的储存空间,因此,在进行如上操作后,指针p的地址将会由系统随机分配,但不论分配的地址为任何值,系统都会将该值解释为指向2的地址。

    1.4、 自定义地址,注意在地址前加上对应指针类型的强制类型转换语句,如:(int *)

    1. int* pt;
    2. pt = (int*)0xb8000000;

    2、new运算符基础

    2.1作用:

    变量是已命名的内存,通过创建指针这个别名可以调用它,但是想要调用一个未命名的内存,则需要用new运算符来实现,即,new的作用是调用未命名的内存并储存值,这个内存是程序运行到new所在部分由系统实时分配的

    调用格式:

    typename *pointer_name = new typename

     如:

    1. int* pn = new int;
    2. *pn = 20;
    3. cout << "*pn:"<< * pn << endl;

    2.2应用:用于在判断语句中给未命名内存存储值:

     使用指针形式结合new运算符即可正常在判断语句外获取正确的值(同样使用于仅使用指针时):

    1. float *kFactor = new float;
    2. int *edgeThresh = new int;
    3. int *contour_bound = new int;
    4. int mode = 2;
    5. if (mode == 1) {
    6. * kFactor = 0.5;
    7. * edgeThresh = 40;
    8. * contour_bound = 20;
    9. }
    10. else {
    11. *kFactor = 0.9;
    12. *edgeThresh = 30;
    13. *contour_bound = 80;
    14. }
    15. cout << "kFactor:" << *kFactor << endl;

    结果:

     2.3 delete运算符

            在使用完new创建的内存后,可以用delete对new调用的内存进行释放,即:

    int *p = new int;

    delete p;

     注意:1、不能重复释放多次。2、尽量不创建指向同一个内存的指针,来避免多次释放同一内存。

    3、使用new创建动态数组

    3.1 说明

            常规的声明数组的做法,会在程序编译时就为其分配内存空间,不管之后是否对其使用,都会占用空间,这样的作法叫做静态联编(static binding)。而使用new来创建的数组,则只会在使用到它的时候为其创建内存,且可以在运行时选择数组的长度,这种做法叫动态联编(dynamic binding),而此时创建的数组叫做动态数组

    3.2 创建与使用

    示例:

    int *ps = new int [10];

    delete [] ps;//方括号意味着在释放整个数组,必须加!!!

    调用:将指针名当数组名使用,在后面加上对应的索引即可,如:

    1. int* p = new int[3];
    2. p[0] = 1;
    3. p[1] = 2;
    4. p[2] = 3;
    5. //cout << p[0] << endl;
    6. //cout << *p + 1 << endl;
    7. delete[]p;

    附,注意事项:

  • 相关阅读:
    C++ call python with cmake
    人工智能 | ShowMeAI资讯日报 #2022.06.26
    .NET 线程独享的全局数据 TLS
    设计模式——2. 工厂模式
    芯启源加入龙蜥社区,推动集成电路和DPU芯片创新落地
    [附源码]计算机毕业设计JAVAjsp超市收银系统
    【从零开始的Java开发】2-10-4 Servlet与jsp进阶:请求与响应的结构、请求转发与响应重定向、Cookie
    前端的易错点
    java面向切面编程AOP案例,记录请求日志
    java添加图片到Excel单元格中(POI)
  • 原文地址:https://blog.csdn.net/lucust/article/details/127933167