《21天學通C++》CH8指針與引用 重點

指針變量用于存儲內(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ū)別之一:引用一定是有效的,而指針可能無效

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容