2016-10-30 38 views
6

ben C++ new kullanarak dinamik dizi oluşturma yaygın bir teknik olduğunu biliyoruz: C++ "yeni" veya dinamik bir dizi yaratmanın başka yolu ile dizideki gibi bir statik oluşturmadan

int * arr = new int[5]; 

Bir kitap da diyor

:

short tell[10]; // tell an array of 20 bytes 
cout << tell << endl; // displays &tell[0] 
cout << &tell << endl; // displays address of the whole array 
short (*p)[10] = &tell; // p points to an array of 20 shorts 

new kullanarak bir dizi için bellek ayrılamadı bir yol olup olmadığını Şimdi merak, bu yüzden daha sonra tüm dizi için bir işaretçi atanabilir. O şöyle olabilir:

int (*p)[5] = new int[5]; 

Yukarıdaki örnek çalışmaz. Sol taraf bana doğru görünüyor. Ama sağda ne olması gerektiğini bilmiyorum.

Amacım mümkün olup olmadığını anlamaktır. Ve biliyorum ki std::vector ve std::array.

UPD İşte

Aslında kontrol etmek istediğim şey:

int (*p1)[5] = (int (*)[5]) new int[5]; 
// size of the whole array 
cout << "sizeof(*p1) = " << sizeof(*p1) << endl; 

int * p2 = new int[5]; 
// size of the first element 
cout << "sizeof(*p2) = " << sizeof(*p2) << endl; 

Ve burada bu diziler erişmek için yapılması gerekenler:

memset(*p1, 0, sizeof(*p1)); 
cout << "p1[0] = " << (*p1)[0] << endl; 

memset(p2, 0, sizeof(*p2) * 5); 
cout << "p2[0] = " << p2[0] << endl; 

cevap

4

biliyorum yaygın tekniği olduğunu dinamik dizi oluşturma

C++ 'da, 20 yıl önce yazılmıştı belki.

Bugünlerde sabit boyut dizisi için dinamik diziler için std::vector ve std::array kullanmalıdır. sürece doğrudan C-işaretçiler uğraşma ve RAII tabanlı dizi sınıf var olarak

(QT en QVector gibi) çerçeve veya platform malzemeleri ilave dizi sınıfları, onlar da ince ise,. Eğer T(*)[size] ile new[] tarafından döndürülen bir işaretçi yakalamak olamaz yani

ve beton cevap olarak

, new T[size] daima T* döndürür.

+0

Yani, bu yapı 'int (* p) [5] =' için bellek ayırmanın mümkün olmadığı anlamına gelir. Sağ? –

+2

zorla c-cast '(int (*) [5]) new int [5]' ile yapabilirsin, ama lütfen gerçek kodda yapmayın. –

+0

Sadece etrafta dolaşıyorum ve kepçe anlayışını almaya çalışıyorum. BTW, neden gerçek kodda yapmamayı söylüyorsun? –

1

Sorun, sol ve sağ manzaraların farklı tiplerde olması. type

int*. 

new int[5] 

edilir:

int (*p)[5] 

int (*)[5]. 
olan

türüVe derleyici, birini diğerine atayamaz.

Genel olarak 'un T (*)[N]'a atanması imkansızdır. Bu nedenle sorunuzun başında belirtilen sözdizimini kullanmanız gerekir.