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