2016-02-24 27 views
5

Diziler bir işleve işaretçi olarak geçirilen ya da referans olarak edilebilir işlev geçmektir. Referans olarak iletmek, büyüklük ve sayı operatörlerinin de çalışacağı bir takma ad verir. Bu, referans olarak geçmeyi üstün kılıyor. Ancak, pointer geçmekC++: normal dizi referans

kitaplarında norm görünüyor. Niye ya? Özellikle diziler için referans olarak bilmem gereken bir şey var mı? referans olarak Geçme

cevap

5

(derleyici bunu zorlar çünkü, boyutlarını bilir bu yüzden) sizin işlevi yalnızca sabit boyutlu diziler kabul edebileceği anlamına gelir. İşaretçiden geçmek başka türlü anlamına gelir. Ayrıca, gösterici tarafından iletmek, daha iyi veya daha kötüsü için nullptr'u geçirmenizi sağlar.

+1

! Dinamik olarak ayrılmış bir dizi, referans olarak geçmek için parametre olarak kabul edilmez mi? Nasıl olur? Bir referans tüm takma adlardan sonradır. – quantum231

+0

@ quantum231 Bir diziyi dinamik olarak ayırmak zaten bir işaretçi döndürür, bu nedenle hayır. –

+1

Otomatik ayırma gereksinimi yoktur, ancak bir tür sorunu var. Örnek: 'void f (int (Arg) [5]);' 'void g() {f (* yeni int [1] [5]);} ' –

1

genellikle std::vector kullanımı ve Sabit referans ile geçmek gibi. Bu, eğer benim api'm bir noktada c koduyla çağrılabilirse, const işaretçisini kullanarak geçiş yapmak mantıklı olabilir, ancak siz de boyutu aşağıya göndermek isteyebilirsiniz. işlevi std::array veya std::vector ile çağrılabilir, bir işaretçi (ve boyutunu) veya Yineleyicilerin (/ ucunu başlayacak) bir dizi aşağı göndermeye karar verebilir.

biz std :: dizisi kullanarak bahsediyorsak, şablon argümanı dizinin boyutunu gerektirir. Biz boyutuna templated işlevi, çiftleşmiş yaparsanız

void myfunc(const std::array<int, 5>& mydata){...} 

Ancak, bu artık bir sorun: Bu normal bir işlev, sabit bir boyut ihtiyacım olacağını anlamına gelecektir. biz yığın tahsis c tarzı diziler bahsedecek olursak

template<unsigned int SZ> 
void myfunc(const std::array<int, SZ>& mydata) {...} 

... İyi C++ tarzı c tarzı diziler için std :: dizi/std :: vector tercih etmektir. C++ Coding Standard by Herb Sutter bölüm 77 okuma önerisi sayfa 152 konuyla ilgili konuşur. C-stili dizileri kullanırken, işaretçiyi ve büyüklüğü göndermek standart yoldur.