指針變量用于存儲內(nèi)存地址
指針編程需要遵循的基本規(guī)則:
1.務必初始化指針變量 ,通常將其初始化為NULL
2.使用指針前,務必檢查它是否為NULL。務必僅在指針有效時才使用它
3.對于使用new分配的內(nèi)存,一定要記得使用delete進行釋放,否則會導致內(nèi)存泄漏。使用delete釋放后,不要再訪問這個指針。
一、什么是指針
聲明一個INT指針:
int *pInteger = NULL
引用運算符 &:獲取變量的地址,也叫地址運算符
接觸引用運算符 * :訪問指針指向的數(shù)據(jù),也叫間接運算符
int DogsAge=30;
int* pAge = &DogsAge;
cin >> *pAge; // * 可以作為左值,直接進行賦值(深賦值,直接改變那塊內(nèi)存地址的內(nèi)容)
二、動態(tài)內(nèi)存分配
使用 new 和 delete 動態(tài)的分配和釋放內(nèi)存,語法如下:
int* pNumber = new int;
delete pNumber; //釋放
int* pNumbers = new int[10]; //支持對于數(shù)組的內(nèi)存分配
delete[ ] pNumbers; //注意這里的 delete[ ]
------------------------注意-----------------------
int* pTemperature;
pTemperature = new int; //這樣是不算new的
必須 int* pTemperature = new int;
new表示請求分配內(nèi)存,并不能保證分配請求總能被滿足,取決于系統(tǒng)狀態(tài)以及內(nèi)存資源的可用性
-
檢查使用new發(fā)出的分配請求是否得到滿足
使用異常處理:
int main()
{
try
{
int* pAge = new int [2432345234];
// use
delete[ ] pAge;
}
catch (bad_alloc)
{
cout << "Memory allocation failed, Ending program" <<endl;
}
}
或者使用new的變種—— new(nothrow),它不引發(fā)異常,而返回NULL
int * pAge = new(nothrow) in [0*1ffffffffffff];
if (pAge) // check pAge !=NULL
....
遞增和遞減運算符(++ 和 --)用于指針的結果:
編譯器認為您要指向內(nèi)存塊中相鄰的值,而不是相鄰的字節(jié)(會自動考慮變量的大?。瑥亩_保了指針不會指向數(shù)據(jù)的中間或末尾,而只會指向數(shù)據(jù)的開頭將關鍵字const用于指針
1.指針指向的數(shù)據(jù)為常量,不能修改,但可以修改指針包含的地址
int HoursInDay = 24;
const int* pInteger = &HoursInDay;
*pInterger = 25;// Cimpile fails:cannot change data
int* pAnotherPointerToInt = pInterger;// Compile fails:cannot assign const (企圖賦給一個非const指針是不可行的)
2.指針包含的地址是常量,不能修改,但可以修改指針指向的數(shù)據(jù)
int* const pDaysInMonth = &DaysInMonth;
3.指針包含的地址以及它指向的值都是常量,不能修改
const int* const pHoursInDay = &HoursInDay;
將指針傳遞給函數(shù)時,函數(shù)參數(shù)應聲明為最嚴格的const指針,以確保函數(shù)不會修改指針指向的值
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) ;//傳入地址
}
- 數(shù)組是指向其第一個元素的指針
int MyNumbers[5];
int* pNumbers = MyNumbers;
要訪問第二個元素,可以使用MyNumber[2],也可以使用*(pNumbers+1)
三、引用
引用是變量的別名,聲明引用是,需要將其初始化為一個變量,因此引用只是另一種訪問相應變量存儲的數(shù)據(jù)的方式
相當于python 中的深拷貝
int Original = 30;
int& Ref = Original; //聲明方式
int& Ref2 = Ref;
Ref,Ref2 都是Original的別名,位于內(nèi)存的同一個地方,可以當作Original使用
- 將關鍵字const用于引用
在函數(shù)參數(shù)中,可能需要禁止引用修改它指向的變量的值
const int& ConstRef = Original; - 引用的優(yōu)點之一,就是避免將形參復制給形參,從而極大的提高性能
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);//這里傳的不是引用,在函數(shù)定義的位置,使用的是引用
}
引用與指針的區(qū)別之一:引用一定是有效的,而指針可能無效