EasyC++,C++指針初探之三
大家好,我是梁唐。
我們前面使用指針創建的都是單個變量,在這種情況下,使用指針的優勢并不明顯。很多程序員仍然會選擇使用聲明變量的方式,而當我們需要動態創建數組這種大型數據的時候,指針就能體現出優勢了。
我們使用聲明的方式創建的數組在編譯時就已經分配好了內存空間了,即使我們在程序當中完全不使用,它也依然存在占用了資源。這種編譯時給數組分配內存被稱為靜態聯編(static binding),意味著數組是在編譯時加入程序的。
而使用new創建的數組則是在運行時,我們前文也說過,兩者最大的區別在于一個是棧內存一個是堆內存。我們可以用程序去控制它是否創建,以及在什么情況下創建,并且數組的長度。因此這種數組被稱為動態數組(dynamic array),這種創建方式稱為動態聯編(dynamic binding)。
創建數組
使用new創建數組很容易,和聲明的方式一樣,只需要將數組的類型以及元素數量寫明即可。
- int *arr = new int[10];
new運算符會申請一塊10個int大小的內存,并且將第一個元素的地址進行返回給指針arr。
對于使用new創建的數組,我們同樣也可以使用delete來釋放,但需要注意的是,由于我們申請的是數組類型,所以在delete的時候也需要寫明這是一個數組:
- delete [] arr;
如果不加方括號,那么delete僅僅會釋放指針指向的元素也就是數組的第一個位置。所以我們在使用new和delete的時候一定要注意,在創建時如果使用了方括號申請了數組,那么在delete的時候也需要加上方括號。如果不匹配則可能會引發不確定的后果,所以千萬要當心。
C++ Primer當中整理了幾條規則,搬運過來:
- 不要使用delete釋放不是new分配的內存
- 不要使用delete釋放同一塊內存兩次
- 如果使用new[]為數組分配內存,則也應該使用delete[]來釋放
- 如果使用new為非數組分配內存,應該使用delete來釋放
- 對空指針delete是安全的
使用動態數組
聊完了delete的用法, 我們再來看看動態數組的使用。
這里有一個問題在于,我們通過new創建得到的雖然是一個數組,但是卻是以指針的形式得到的,那么我們怎么來使用呢?
其實很簡單,我們就當做和數組一樣來使用就行了:
- int *p = new int[10];
- p[2] = 5;
- cout << p[2] << endl;
因為數組本質上就是常量指針,因此它們基本等價。唯一的不同在于數組是常量指針,所以我們不能對數組名進行賦值操作,而指針可以:
- p = p + 1;
- ++p;
是的,指針可以進行算術操作,對于指針進行加減操作其實等價于指針的移動。比如指針加一代表指向的元素向后移動一位。
原本p指針指向數組的下標0的位置,當p++之后,指向1的位置。因為數組是一塊連續的內存,不同類型的變量的長度不同。因此在底層運算的時候,指針指向的位置移動的長度其實并不是1,而是一個變量類型占用的字節數。
同理,指針也可以做減法,得到的差是一個整數。這種運算只有兩個指針指向同一個數組才有意義,代表兩個指針之間間隔的元素數量。
本文轉載自微信公眾號「Coder梁」,可以通過以下二維碼關注。轉載本文請聯系Coder梁公眾號。