2010-08-01 46 views
8

int(* p)[4];int(* p)[4]?

是「p」指向4個整數數組的指針嗎?或者是什麼 ??

以及如何爲這個指針調用「新」?

+0

正如你可以從下面的答案中看到的。這種類型聲明的王是混淆和非直觀的,因此最好避免(除非你想添加過多的評論)。如果你使用其他的構造,你可以用更可讀的方式獲得相同的結果(例如std :: vector <>或boost :: array) – 2010-08-01 17:41:39

+0

@Martin:'std :: vector <>'是一個完全不同的動物, int(* p)[4]'! – Seth 2010-08-01 17:58:00

+2

@Seth:但是'int(* p)[4]'可能更好地替換爲二維的'std :: vector >'或一維'std :: vector '手動索引算術或'boost :: multi_array '。 – fredoverflow 2010-08-01 18:02:23

回答

7

「p」是指向4個整數數組的指針嗎?

正確!

我該如何爲這個指針調用「new」?

例如,p = new int[7][4]

+3

Err ..是+1直到編輯。new int [7] [4]給你一個單塊28 ints寬 – 2010-08-01 17:18:00

+0

humm ..所以我認爲p是指向4個整數的指針,每個指針指向4個整數的數組,它是正確的?? – 2010-08-01 17:20:54

+3

@Billy:我的例子沒有什麼錯,new int [*] [*] * * int *(int)* [4]'也許它更明顯的typedef?typedef int row [4]; row * p = new row [7];'This is exactly相當於我的代碼,只是更具可讀性,你會認爲這是錯誤的嗎? – fredoverflow 2010-08-01 17:22:23

3

online CDECL evaluator是這樣的問題一個有用的資源:


cdecl 

C gibberish ↔ English 

int (*p)[4]; 

    declare p as pointer to array 4 of int 
+0

+1這很酷! – fredoverflow 2010-08-01 18:00:11

+0

...除了'int(* p)[4];'不_declare_'p',而是__defines__它。 (至少在C++中,這個問題是關於的,正如Johannes曾經指出的那樣,在一些領域中,C和C++在什麼是定義和什麼是聲明方面有所不同)。 – sbi 2010-08-01 18:27:20

+0

@sbi:好的,但是每個定義也是一個聲明;)「C聲明符語法」是一個公認的術語。 – fredoverflow 2010-08-01 18:29:08

6

int (*p)[4],着實是一個指向四個int秒的陣列。

您可以動態分配類型爲「指向四個int的數組的指針」的對象,如下所示。

int (**ptr)[4] = new (int (*)[4]); 

請注意,任何int s都沒有分配空間;只有指針本身。

您可以分配的4個整數數組如下:

int *ptr = new int[4]; 

你不能做什麼(沒有明確鑄造)是一個指向4 int動態分配的數組分配給類型的指針int (*)[4]。無論何時通過new分配數組,即使使用typedef,新表達式的類型也是指向數組的第一個元素的指針;數組的大小不會保留在new表達式的類型中。

這是因爲new[]表達式可以分配在運行時選擇數組大小的數組,因此將數組大小編碼爲新表達式的類型並不總是可能的(或者甚至是理想的)。

如前所述,您可以動態分配一個數組,其中包含一個4 int的數組。第一個數組的大小從類型信息中丟失,並且您得到的是指向四個int的數組的第一個元素(大小爲1)的指針。

int (*p)[4] = new int[1][4]; 

儘管它只是1(4 INT的陣列)的陣列,則仍然需要使用delete[]解除分配p

delete[] p; 
+2

當然,我們不應該真的需要手動調用delete。 – GManNickG 2010-08-01 21:16:11

+0

那麼,int(* p)[4] = new int [4] [4] ... dow可以調用delet嗎? 我嘗試: for(int i = 0; i <4; i ++) delete [] p [i]; delete [] p; 但它不起作用:( – 2010-08-02 13:39:09

+2

@Farah_online:數組的大小並不重要,你總是用delete [] p;''''刪除數組''所以'p = new int [1] [4]; ''delete [] p'和'p = new int [4] [4];'...'delete [] p'調用數組成員(delete [] p [i]或'delete p [i]')無效。 – 2010-08-02 15:30:25

相關問題