[英]What does int **p in mean?
我知道我們在需要給動態內存中的指針數組提供指針時會用到它,但是我不明白的是它在堆棧中的工作方式。
這是否也使堆棧中的指針數組也指向堆中的指針數組,還是使堆棧中的單個指針指向堆中的指針數組? 如果是,那么兩者之間有什么區別
int **p = new int*[100]
和
int *p = new int[100]
提前致謝。 我已經很長時間了試圖理解這一點,並且已經在線閱讀了很多文檔,但是我還是不明白。
int **p
在堆棧上聲明一個指針,該指針指向堆上的指針。 每個指針都指向堆上的一個整數或整數數組。
這個:
int **p = new int*[100];
表示您在堆棧上聲明了一個指針並對其進行了初始化,以使其指向堆上包含100個指針的數組。 目前,這100個指針中的每一個都指向無處。 “無處”是指它們既不指向有效的內存塊,也不是nullptr
。 它們沒有被初始化,因此它們包含一些在分配指針之前在內存中的垃圾值。 您應該在使用前循環分配一些有意義的東西給他們。 需要注意的是p[0]
- p[99]
指針不能保證,如果你指定的返回值指向的內存相鄰區域new
給他們。 例如,如果您為每個內存分配內存,則p[i] = new int[200];
, p[0][201]
不會引用p[1][2]
,但是會導致未定義的行為。
和這個:
int *p = new int[100];
是堆棧上的一個指針,指向堆上100個整數的數組。
不用擔心,C語言中的指針和數組總是引起混亂。 通常,聲明一個類型為int的數組時,會創建一個int類型的指針,該指針指向將存儲int的連續內存塊中的第一個元素。 例如,如果我有一個簡單的使用int *p_to_intarr = new int[3]
數組, int *p_to_intarr = new int[3]
得到以下信息:
+++++++ <--------- p_to_intarr
| int |
+++++++
| int |
+++++++
| int |
+++++++
通常,如果我想要一個類型T的數組,則創建一個指向類型T的指針,例如T *ptr_to_Tarr = new T[3]
。
那么,如果我想要一個整數數組怎么辦? 讓我們用一個“整數數組”的類型替換T
in,這將給我們一個“整數數組”的數組。 好吧,我們只是在第一個示例中說過int *
中的int *
數組的類型,因此int *
的數組的數組將是: int* *ptr_to_arrayofintarr = new int*[3]
。 請注意,我們只是將T替換為int星型。 這通常寫得更整潔,如int **ptr_to_arrayofintarr = new int*[3]
。
因此int **p
可以是指向2d數組的指針。 它也可以是對一維數組的引用。 取決於具體情況:)
new
表達式的計算結果為某種類型的指針, 指向已在免費存儲區(實際上是堆)中分配但不一定在免費存儲區中分配的內存。 (根據上下文,它仍然可以位於免費存儲區中;例如,考慮在構造函數中的初始化列表,用於在免費存儲區中分配的對象。)
由new
初始化的對象當然在免費商店中。
在還有你的賦值語句,您可以看到返回的指針類型new
上等號的左邊,而自由存儲對象(S)到右邊的類型new
。 因此,在第一種情況下,本地評估的唯一對象(即可能在堆棧上)是指向int的指針,而在第二種情況下,則是指向int的指針。 自由空間中的對象在第一種情況下是一個指向int的指針的數組,在第二種情況下是一個簡單的int的數組。
注意,僅僅因為第一個賦值中的數組由指針組成,並不意味着指針本身實際上已經指向任何東西; new
不會神奇地遞歸為它創建的數組中的任何指針所針對的對象分配可用空間。 (反正這沒有多大意義。)
**
表示您有一個指向指針的指針。 實際上,這意味着您擁有一個二維數組。
由於數組的每個元素也是一個指針,因此您還需要初始化這些指針:
for (int i = 0; i < 100; ++i)
p[i] = new int[200];
這將初始化一個100x200的數組。 您可以使用p[99][199]
訪問右下角。
是時候刪除指針了,您必須逆轉該過程:
for (int i = 0; i < 100; ++i)
delete [] p[i];
delete [] p;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.