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

指针变量用于存储内存地址
指针编程需要遵循的基本规则:
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);//这里传的不是引用,在函数定义的位置,使用的是引用
}

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

猜你喜欢

转载自blog.csdn.net/weixin_34019144/article/details/87200997