C++學習 之 指針及動態內存分配(筆記)


1. 指針

  1.1 指針的含義:

  簡單來說,指針是存儲內存地址的變量。當我們聲明了一個指針變量后,使用該指針時系統會根據指針內的地址索引內存塊,讀取內存內的值。指針因為是用來存地址的,所以一般固定長度為4個字節。void指針指向內存塊的指針。

  指針的定義示例:

int a=0;

int *Pointer_a=&a;

 

  在編寫程序時我們可以使用&(引用運算符或地址運算符)獲取變量或常量的地址,例如上例中獲取a變量地址就是用&a。對於指針來說指針本身存儲地址,加上*(解除引用運算符)讀取該地址下的值。如上例,Pointer_a存放的就是a的地址,*Pointer_a就是讀取a的值。

  1.2 指針的運算(++和--):

  和數組具有相似之處,指針也可以進行地址運算。

  我們可以用指針遍歷數組試試:

int Array[5]={1,2,3,4,5};
int *p=Array;//Array存放的為數組的第一個元素的地址
for(int i=0;i<5;i++)
{
    cout<<"Array["<<i+1<<"]: "<<*p<<endl;
    p++;
}

2.動態內存分配

  2.1使用new和delete動態分配和釋放內存:

  new可以申請分配一個內存塊(申請不一定會成功受限於系統的狀態),如果成功則返回指向一個指針,指向分配的內存,否則會出現異常。delete用於釋放new所分配的空間,當我們使用new分配的空間不在使用時,一定要及時釋放否則會拖慢系統。

  動態內存分配示例:

  

int* p, * p_copy, number = 0;

 

cout << "請輸入需要存放的整數數量:";
cin >> number;
p = new int[number];//根據需要動態分配內存空間
p_copy = p;//存儲p的初始地址

 

cout << "請輸入各整數(用空格隔開):";
for (int i = 0; i < number; i++)//輸入各整數
{
  cin >> *p_copy;
  p_copy++;
}
for (int i = 0; i < number; i++)//輸出動態分配的空間內的各整數值
{
  cout <<"第"<<i+1<<"整數為:"<<*p<<endl;
  p++;
}

  

  2.2動態分配內存空間的注意事項:

  使用new分配內存空間后沒有釋放,導致程序運行時間越長系統越慢。要注意在new和delete的配合使用,否則會導致內存泄漏問題。在我們對原本有效的指針使用delete后指針便變為無效指針,此時指針為懸浮指針。還有就是指針在被定義之后沒有指向內存空間或存儲變量地址,這樣的指針也是無效的。對無效指針解除引用程序往往會出現異常。所以,我們可以把指針初始化為NULL,使用前對指針是否有效進行檢查。

  2.3動態分配內存空間異常處理:

  如果在使用new時分配不成功,將使得程序中斷,並彈出錯誤窗口。對此我們可以編寫異常處理程序,在分配成功時正常執行,不成功時也能妥善退出。

  例如:

 

try
{
    int *p=new int [536870911];
    delete [] p;
}
catch (bad_alloc)
{
    cout<<"內存分配失敗,程序結束"<<endl;
}

 

  或者使用new(nothrow),在分配失敗時返回NULL。

  例如:

int *p=new(nothrow)int [0x1fffffff];
if(p)//檢查p是否為空
{
    delete [] p;//當p為空時,釋放p的內存
}
else
    cout<<"內存分配失敗,程序退出"<<endl;

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM