使用new來建立動態陣列

2022-08-11 23:03:17 字數 2483 閱讀 1399

使用new來建立動態陣列(1)

如果程式只需要乙個值,則可能會宣告乙個簡單變數,因為對於管理乙個小型資料物件來說,這樣做比使用new和指標更簡單,儘管給人留下的印象不那麼深刻。通常,對於大型資料(如陣列、字串和結構),應使用new,這正是new的用武之地。例如,假設要編寫乙個程式,它是否需要陣列取決於執行時使用者提供的資訊。如果通過宣告來建立陣列,則在程式被編譯時將為它分配記憶體空間。不管程式最終是否使用陣列,陣列都在那裡,它占用了記憶體。在編譯時給陣列分配記憶體被稱為靜態聯編(static binding),意味著陣列是在編譯時加入到程式中的。但使用new時,如果在執行階段需要陣列,則建立它;如果不需要,則不建立。還可以在程式執行時選擇陣列的長度。這被稱為動態聯編(dynamic binding),意味著陣列是在程式執行時建立的。這種陣列叫作動態陣列(dynamic array)。使用靜態聯編時,必須在編寫程式時指定陣列的長度;使用動態聯編時,程式將在執行時確定陣列的長度。

下面來看一下關於動態陣列的兩個基本問題:如何使用c++的new運算子建立陣列以及如何使用指標訪問陣列元素。

1.使用new建立動態陣列

在c++中,建立動態陣列很容易;只要將陣列的元素型別和元素數目告訴new即可。必須在型別名後加上方括號,其中包含元素數目。例如,要建立乙個包含10個int元素的陣列,可以這樣做:

new運算子返回第乙個元素的位址。在這個例子中,該位址被賦給指標psome。

當程式使用完new分配的記憶體塊時,應使用delete釋放它們。然而,對於使用new建立的陣列,應使用另一種格式的delete來釋放:

方括號告訴程式,應釋放整個陣列,而不僅僅是指標指向的元素。請注意delete和指標之間的方括號。如果使用new時,不帶方括號,則使用delete時,也不應帶方括號。如果使用new時帶方括號,則使用delete時也應帶方括號。c++的早期版本無法識別方括號表示法。然而,對於ansi/iso標準來說,new與delete的格式不匹配導致的後果是不確定的,這意味著程式設計師不能依賴於某種特定的行為。

總之,使用new和delete時,應遵守以下規則。

不要使用delete來釋放不是new分配的記憶體。

不要使用delete釋放同乙個記憶體塊兩次。

如果使用new [ ]為陣列分配記憶體,則應使用delete [ ]來釋放。

如果使用new [ ]為乙個實體分配記憶體,則應使用delete(沒有方括號)來釋放。

對空指標應用delete是安全的。

現在我們回過頭來討論動態陣列。psome是指向乙個int(陣列第乙個元素)的指標。您的責任是跟蹤記憶體塊中的元素個數。也就是說,由於編譯器不能對psome是指向10個整數中的第1個這種情況進行跟蹤,因此編寫程式時,必須讓程式跟蹤元素的數目。

實際上,程式確實跟蹤了分配的記憶體量,以便以後使用delete [ ]運算子時能夠正確地釋放這些記憶體。但這種資訊不是公用的,例如,不能使用sizeof運算子來確定動態分配的陣列包含的位元組數。

為陣列分配記憶體的通用格式如下:

使用new運算子可以確保記憶體塊足以儲存num_elements個型別為type_name的元素,而pointer_name將指向第1個元素。下面將會看到,可以以使用陣列名的方式來使用pointer_name。

2.使用動態陣列

建立動態陣列後,如何使用它呢?首先,從概念上考慮這個問題。下面的語句建立指標psome,它指向包含10個int值的記憶體塊中的第1個元素:

可以將它看作是一根指向該元素的手指。假設int佔4個位元組,則將手指沿正確的方向移動4個位元組,手指將指向第2個元素。總共有10個元素,這就是手指的移動範圍。因此,new語句提供了識別記憶體塊中每個元素所需的全部資訊。

現在從實際角度考慮這個問題。如何訪問其中的元素呢?第乙個元素不成問題。由於psome指向陣列的第1個元素,因此*psome是第1個元素的值。這樣,還有9個元素。如果沒有使用過c語言,下面這種最簡單的方法可能會令您大吃一驚:只要把指標當作陣列名使用即可。也就是說,對於第1個元素,可以使用psome[0],而不是*psome;對於第2個元素,可以使用psome[1],依此類推。這樣,使用指標來訪問動態陣列就非常簡單了,雖然還不知道為何這種方法管用。可以這樣做的原因是,c和c++內部都使用指標來處理陣列。陣列和指標基本等價是c和c++的優點之一(這在有時候也是個問題,但這是另一碼事)。稍後將更詳細地介紹這種等同性。

首先,程式清單4.18演示了如何使用new來建立動態陣列以及使用陣列表示法來訪問元素;它還指出了指標和真正的陣列名之間的根本差別。

使用new來建立動態陣列(2)

程式清單4.18  arraynew.cpp

下面是該程式的輸出:

從中可知,arraynew.cpp將指標p3當作陣列名來使用,p3[0]為第1個元素,依次類推。下面的**行指出了陣列名和指標之間的根本差別:

不能修改陣列名的值。但指標是變數,因此可以修改它的值。請注意將p3加1的效果。表示式p3[0]現在指的是陣列的第2個值。因此,將p3加1導致它指向第2個元素而不是第1個。將它減1後,指標將指向原來的值,這樣程式便可以給delete[ ]提供正確的位址。

4 7 6 使用 new 來建立動態陣列

使用常規陣列儲存資料時,一般都是在程式編譯時就已經為陣列分配好了記憶體。如果儲存的資料未達到陣列的長度,就會導致很多記憶體閒置,致使效率較低。對於處理一些大型資料,我們就可以使用 new 進行動態記憶體分配。常規通過宣告來建立陣列,則在程式被編譯時就已經為它分配好了記憶體空間,不管程式最終是否使用陣...

C 學習筆記 使用New來建立動態陣列

1 如何使用c 的new運算子建立陣列 建立乙個包含10個int元素的陣列 int psome new int 10 程式使用完new分配的記憶體塊時,應該用delete釋放 delete psome 使用new和delete時,應遵守以下規則 1 不要使用delete來釋放不是new分配的記憶體 ...

new動態建立陣列?(new建立多維陣列)

在使用陣列時我們難免會感覺陣列的靈活性太低,所以new成了我們使用頻率很高的乙個操作符。int p 2 int p2 2 2 int p3 2 2 2 這是最常規的操作。接下來上new的用法 new的第一種用法 int p newint 5 int p2 4 newint 5 4 int p3 4 ...