什么是指針?
指針是存儲內存地址的變量。就像int變量用于存儲整數值一樣,指針變量用于存儲內存地址。指針是一種指向內存單元的特殊變量。
內存單元地址通常使用的是16進制表示(0~9和A~F)來表示數字。顯示16進制數時,通常使用前綴0x。
聲明指針:作為一種變量,指針也需要聲明。通常將指針聲明為聲明為指向特定的類型。如int,者意味著指針包含的地址對應的內存單元存儲了一個整數。
PointedType * PointerVariableName;
注意:除非對指針進行初始化,否則它包含的將是垃圾值。對于指針來說,這種垃圾值非常危險,因為指針包含的值被視為地址。未初始化的指針可能導致程序訪問非法內存單元,進而導致程序崩潰。因此將指針初始化為NULL。
使用引用運算符(&)獲取變量的地址
int age = 30;
&age 將是存儲該變量的值(30)的內存的地址。
使用指針存儲地址
int age = 30;
int* pAage = &age;
給指針重新賦值,使其指向另外一個變量
動態內存分配
如果在程序中使用下面這樣的數組聲明:
int myNums[100];
程序存在兩個問題:
1.這限制了程序的容量,無法存儲100個以上的數字
2.如果只需存粗1個數組,卻為100個數字預留存儲空間,這將降低系統的性能。
原因:數組的內存分配是靜態和固定的。
使用new和deldete動態地分配和釋放內存
使用new來分配新的內存塊,通常情況下,如果成功,new將返回指向一個指針,指向分配的內存,否則將引發異常。使用new時,需要指定要為哪種數據類型分配內存。
Type* p = new Type;
需要為多個元素分配內存時,還可指定要為多少個元素分配內存
Type * p = new Type[num];
舉例:
int* p = new int;
int* p = new int[10];
注意:使用new分配的內ucn最終都需使用對應的delete進行釋放。
delete p;
delet[] p;
將關鍵字const用于指針
1.指針包含的地址是常量,不能修改,但可修改指針指向的數據
int day = 30;
int* const p = &day;
*p = 31;//OK!Data pointed to can be changed
int day2 = 28;
p = &day2;//Not OK! Cannot change address!
2.指針指向的數據為常量,不能修改,但可以修改指針包含的地址,即指針可以指向其他的地方。
int a = 24;
const int* p = &a;
int b = 12;
p = &b;//OK
*p = 13;//Not OK
3.指針包含的地址以及它指向的值都是常量,不能修改
int a = 24;
const int* const p = &a;
*p = 13;//Not ok
int b = 12;
p = &b;//Not Ok
使用指針時常犯的編程錯誤
1.內存泄漏
如果使用new動態分配的內存不再需要后,程序員沒有使用配套的delete釋放。
2.指針指向無效的內存單元
在使用*對指針解除引用,以訪問指向的值時,務必確保指針指向有效的內存單元,否則程序要么崩潰,要么行為不端。
指針編程應該遵守一些基本原則
1.務必初始化指針變量,否則它將包含垃圾值,初始化NULL
2.務必僅再指針有效時才使用它,否則程序可能崩潰
3.對于使用new分配得內存,一定要記得使用delete進行釋放,否則應用程序將泄漏內存,進而降低系統得性能。
4.使用delete釋放內存塊或指針后,不要訪問它
5.不要對同一個內存地址調用多次delete
6.使用完動態分配得內存塊后,被網絡對其調用delete
引用是變量得別名。聲明引用時,需要將其初始化為一個變量,因此引用只是另一種訪問相應變量存儲數據得方式。
要聲明引用,可使用引用運算符&
VarType original = value;
VarType& ReferenceVariable = original;
using namespace std;
int main(){
int a= 30;
cout << “a=” << a << endl;
cout << “a is at address:” << &a << endl;
int*& b = a;
cout << "b is at address:" << &b << endl;
}
輸出:a 和 b 的地址相同
因此,引用是真正的別名,即相應變量的另一個名字
是什么讓引用很有用?
引用讓您能夠訪問相應變量所在的內存單元。
using namespce std;
void GetSquare(int& number){
number*= number;
}
int main(){
cout << “Enter a number you wish to square”;
int number = 5;
GetSquare(number);
cout << "number = " << number << endl;
}
輸出:25
將關鍵字const用于引用
需要禁止通過引用修改它指向的變量的值,為此可在聲明引用時使用關鍵子const
int a = 30;
const int& b = a;
b = 45;//Not allowed:constRef can’t change value in original
int& c = b;//Not allowed.c is not const
問與答
1.我聲明了兩個指針
int* a = new int;
int* b = a;為了釋放內存,是否需要對他們都調用delete?
答:這樣做是錯誤的,對new返回的地址,只能調用delete一次,最好避免讓兩個指針指向相同的地址,因為對其中一個調用delete將導致另外一個無效。