美文网首页
《21天学通C++》CH8指针与引用 重点

《21天学通C++》CH8指针与引用 重点

作者: 飞翔的小瓜瓜 | 来源:发表于2019-01-29 11:23 被阅读0次

    指针变量用于存储内存地址
    指针编程需要遵循的基本规则:
    1.务必初始化指针变量 ,通常将其初始化为NULL
    2.使用指针前,务必检查它是否为NULL。务必仅在指针有效时才使用它
    3.对于使用new分配的内存,一定要记得使用delete进行释放,否则会导致内存泄漏。使用delete释放后,不要再访问这个指针。

    一、什么是指针

    声明一个INT指针:
    int *pInteger = NULL
    引用运算符 &:获取变量的地址,也叫地址运算符
    接触引用运算符 * :访问指针指向的数据,也叫间接运算符

    int DogsAge=30;
    int* pAge = &DogsAge;
    cin >> *pAge; // * 可以作为左值,直接进行赋值(深赋值,直接改变那块内存地址的内容)
    

    二、动态内存分配

    使用 new 和 delete 动态的分配和释放内存,语法如下:

    int* pNumber = new int;
    delete pNumber; //释放
    int* pNumbers = new int[10]; //支持对于数组的内存分配
    delete[ ] pNumbers; //注意这里的 delete[ ] 
    ------------------------注意-----------------------
    int* pTemperature;
    pTemperature = new int; //这样是不算new的
    必须 int* pTemperature = new int;
    

    new表示请求分配内存,并不能保证分配请求总能被满足,取决于系统状态以及内存资源的可用性

    • 检查使用new发出的分配请求是否得到满足
      使用异常处理:
    int main()
    {
        try
        {
            int* pAge = new int [2432345234];
            // use
            delete[ ] pAge;
        }
        catch (bad_alloc)
        {
            cout << "Memory allocation failed, Ending program" <<endl;
        }
    }
    

    或者使用new的变种—— new(nothrow),它不引发异常,而返回NULL

    int * pAge = new(nothrow) in [0*1ffffffffffff];
    if (pAge) // check pAge !=NULL
        ....
    
    • 递增和递减运算符(++ 和 --)用于指针的结果
      编译器认为您要指向内存块中相邻的值,而不是相邻的字节(会自动考虑变量的大小),从而确保了指针不会指向数据的中间或末尾,而只会指向数据的开头

    • 将关键字const用于指针
      1.指针指向的数据为常量,不能修改,但可以修改指针包含的地址

    int HoursInDay = 24;
    const int* pInteger = &HoursInDay;
    *pInterger = 25;// Cimpile fails:cannot change data
    int* pAnotherPointerToInt = pInterger;// Compile fails:cannot assign const (企图赋给一个非const指针是不可行的)
    

    2.指针包含的地址是常量,不能修改,但可以修改指针指向的数据
    int* const pDaysInMonth = &DaysInMonth;
    3.指针包含的地址以及它指向的值都是常量,不能修改
    const int* const pHoursInDay = &HoursInDay;
    将指针传递给函数时,函数参数应声明为最严格的const指针,以确保函数不会修改指针指向的值

    void CalcArea(const double* const pPi , const double* const pRadius, 
    double* const pArea)//只有pArea是可以修改变量,不可修改地址
    {
    if (pPi && pRadius && pArea)
        *pArea = (*pPi) * (*pRadius) * (*pRadius);
    }
    int main()
    {
    CalcArea (&Pi,&Radius,&Area) ;//传入地址
    }
    
    • 数组是指向其第一个元素的指针
    int MyNumbers[5];
    int* pNumbers = MyNumbers;
    要访问第二个元素,可以使用MyNumber[2],也可以使用*(pNumbers+1)
    

    三、引用

    引用是变量的别名,声明引用是,需要将其初始化为一个变量,因此引用只是另一种访问相应变量存储的数据的方式
    相当于python 中的深拷贝

    int Original = 30;
    int& Ref = Original; //声明方式
    int& Ref2 = Ref;
    Ref,Ref2 都是Original的别名,位于内存的同一个地方,可以当作Original使用
    
    • 将关键字const用于引用
      在函数参数中,可能需要禁止引用修改它指向的变量的值
      const int& ConstRef = Original;
    • 引用的优点之一,就是避免将形参复制给形参,从而极大的提高性能
    void CalculateSquare(const int& Number,int& Result)
     // note const,can't change Number's value 
    {
    Result = Number * Number ;//没有return ,直接修改了Result的值
    }
    int main()
    {
        int Number=5;
        int Square=0;
        CalculateSquare(Number,Square);//这里传的不是引用,在函数定义的位置,使用的是引用
    }
    

    引用与指针的区别之一:引用一定是有效的,而指针可能无效

    相关文章

      网友评论

          本文标题:《21天学通C++》CH8指针与引用 重点

          本文链接:https://www.haomeiwen.com/subject/fwgtsqtx.html