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;