zoukankan      html  css  js  c++  java
  • C++学习 之 指针及动态内存分配(笔记)

    1. 指针

      1.1 指针的含义:

      简单来说,指针是存储内存地址的变量。当我们声明了一个指针变量后,使用该指针时系统会根据指针内的地址索引内存块,读取内存内的值。指针因为是用来存地址的,所以一般固定长度为4个字节。void指针指向内存块的指针。

      指针的定义示例:

    int a=0;
    
    int *Pointer_a=&a;

      在编写程序时我们可以使用&(引用运算符或地址运算符)获取变量或常量的地址,例如上例中获取a变量地址就是用&a。对于指针来说指针本身存储地址,加上*(解除引用运算符)读取该地址下的值。如上例,Pointer_a存放的就是a的地址,*Pointer_a就是读取a的值。

      1.2 指针的运算(++和--):

      和数组具有相似之处,指针也可以进行地址运算。

      我们可以用指针遍历数组试试:

    int Array[5]={1,2,3,4,5};
    int *p=Array;//Array存放的为数组的第一个元素的地址
    for(int i=0;i<5;i++)
    {
        cout<<"Array["<<i+1<<"]: "<<*p<<endl;
        p++;
    }

    2.动态内存分配

      2.1使用new和delete动态分配和释放内存:

      new可以申请分配一个内存块(申请不一定会成功受限于系统的状态),如果成功则返回指向一个指针,指向分配的内存,否则会出现异常。delete用于释放new所分配的空间,当我们使用new分配的空间不在使用时,一定要及时释放否则会拖慢系统。

      动态内存分配示例:

      

    int* p, * p_copy, number = 0;

    cout << "请输入需要存放的整数数量:";
    cin >> number;
    p = new int[number];//根据需要动态分配内存空间
    p_copy = p;//存储p的初始地址

    cout << "请输入各整数(用空格隔开):";
    for (int i = 0; i < number; i++)//输入各整数
    {
      cin >> *p_copy;
      p_copy++;
    }
    for (int i = 0; i < number; i++)//输出动态分配的空间内的各整数值
    {
      cout <<"第"<<i+1<<"整数为:"<<*p<<endl;
      p++;
    }

      

      2.2动态分配内存空间的注意事项:

      使用new分配内存空间后没有释放,导致程序运行时间越长系统越慢。要注意在new和delete的配合使用,否则会导致内存泄漏问题。在我们对原本有效的指针使用delete后指针便变为无效指针,此时指针为悬浮指针。还有就是指针在被定义之后没有指向内存空间或存储变量地址,这样的指针也是无效的。对无效指针解除引用程序往往会出现异常。所以,我们可以把指针初始化为NULL,使用前对指针是否有效进行检查。

      2.3动态分配内存空间异常处理:

      如果在使用new时分配不成功,将使得程序中断,并弹出错误窗口。对此我们可以编写异常处理程序,在分配成功时正常执行,不成功时也能妥善退出。

      例如:

    try
    {
        int *p=new int [536870911];
        delete [] p;
    }
    catch (bad_alloc)
    {
        cout<<"内存分配失败,程序结束"<<endl;
    }

      或者使用new(nothrow),在分配失败时返回NULL。

      例如:

    int *p=new(nothrow)int [0x1fffffff];
    if(p)//检查p是否为空
    {
        delete [] p;//当p为空时,释放p的内存
    }
    else
        cout<<"内存分配失败,程序退出"<<endl;

      

  • 相关阅读:
    Win10下IIS配置图解、MVC项目发布图解、IIS添加网站图解
    小猴子下落(二叉树,思维)
    Curious Robin Hood(树状数组+线段树)
    表达式求值(后缀表达式求值)
    郁闷的C小加(一)(后缀表达式)
    最小公倍数(大数)
    修路方案(次小生成树)
    Cipher(置换群)
    Cow Sorting(置换群)
    Necklace of Beads(polya计数)
  • 原文地址:https://www.cnblogs.com/dulm/p/11240703.html
Copyright © 2011-2022 走看看