C++ dizisi uzunluğu yalnızca işaretçilerle nasıl olsun? Bu sekme adının ilk öğeye gösterici olduğunu biliyorum, ama sonra ne olacak?İşaretçilerle dizi uzunluğu
cevap
Yapamazsınız. Bir işaretçi sadece bir bellek konumudur ve boyutu belirleyebilecek özel bir şey içermez.
bu C++ olduğundan, ne yapmak, böylece gibi referans olarak dizi geçmesine geçerli:
template <typename T, size_t N>
void handle_array(T (&pX)[N])
{
// the size is N
pX[0] = /* blah */;
// ...
pX[N - 1] = /* blah */;
}
// for a specific type:
template <size_t N>
void handle_array(int (const &pX)[N]) // const this time, for fun
{
// the size is N
int i = pX[0]; // etc
}
Ama aksi takdirde, Alok anlaşılacağı gibi, bir çıkarma geçmesi & ucunu başlatmak ve yapılacak bir başlangıca ihtiyacımız & Size önerdiğiniz gibi, boyut, ya da statik bir dizi hendek ve Tyler'ın önerdiği gibi bir vektör kullanın. Eğer çalışıyor olacağım dizinin boyutunu biliyorsanız
, önceden birer typedef
: Kullandığım
template <typename T, size_t N>
size_t countof(T (&pX)[N])
{
return N;
}
template <typename T, size_t N>
T* endof(T (&pX)[N])
{
return &pX[0] + N;
}
// use
int someArray[] = {1, 2, 6, 2, 8, 1, 3, 3, 7};
size_t count = countof(someArray); // 9
std::for_each(someArray, endof(someArray), /* ... */);
:
typedef int int_array[10];
void handle_ten_ints(int_array& pX)
{
// size must be 10
}
Ve sadece boyutu için Bu yardımcı program zaman zaman çalışır.
Bunu yapamazsınız. Dizi uzunluğunu dizi işaretçisiyle birlikte geçirmeniz veya std::vector
gibi bir kapsayıcı nesnesini kullanmanız gerekir. ne son işaretçi dereferences bilmek sürece, Yapamazsın
int a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */
Ve yakında std :: dizi :) – coelhudo
Bu noktada C++ 4x sonuçlandırıldığında sosyal güvenliği toplamayı bekliyorum. –
Büyük sorunun ne olduğunu göremiyorum: şu anda boost :: array'i kullanabilirsiniz. –
Sen gibi bir şey yani. Char dizileri durumunda, '\ 0', bu yüzden uzunluğunu anlamak için bu karakteri okuyana kadar döngü yapabilirsiniz.
Hayır, bir "son" işaretçisi geleneksel olarak bir-son-bitiyor (hangisi yasaldır) özellikle bu yüzden son - başlangıç = uzunluk, ve böylece (int * i = start; i! = end; ++ i) 'gibi şeyler yapabilirsiniz. –
@Tyler: teşekkürler. –
- 1. Linux Kernel: copy_from_user - işaretçilerle yapı
- 2. Bir işlevdeki işaretçilerle ilgili sorunlar
- 3. Java dizi uzunluğu 0'dan az mı?
- 4. 2d dizi satır/sütun uzunluğu C
- 5. JavaScript dizi elemanının uzunluğu en fazla elde
- 6. İşaretçiyi kullanarak bir dizi uzunluğu alın
- 7. Bir dizi listesinin uzunluğu nasıl bulunur?
- 8. Eclipse debugger'da dizi uzunluğu nasıl görüntülenir?
- 9. Fortran ve Visual Studio hata ayıklamada otomatik dizi uzunluğu
- 10. WCF servisi Maksimum dizi uzunluğu kotası (16384) aşıldı
- 11. python/numpy: 2D dizi sütun uzunluğu nasıl edinilir?
- 12. Maksimum bayt uzunluğu []?
- 13. HttpRuntime.Cache nesnesinde maksimum önbellek uzunluğu uzunluğu?
- 14. matlab uzunluğu
- 15. Dizi davranışı nasıl kopyalanır?
- 16. Dizinin uzunluğu JSON.Net
- 17. boost :: python :: liste uzunluğu
- 18. Düzenli İfade Minimum Uzunluğu
- 19. ** argv parametrelerinin maksimum uzunluğu
- 20. Kontrol alan uzunluğu awk
- 21. ntext sütunundaki veri uzunluğu?
- 22. Optimal şifre tuz uzunluğu
- 23. PDO girişin maksimum uzunluğu
- 24. Hat Uzunluğu PHP_CodeSniffer
- 25. Dizinin uzunluğu nasıl artırılır
- 26. Javascript bir dize uzunluğu
- 27. haskell ve dize uzunluğu
- 28. Değiştir metin uzunluğu OnClick
- 29. xargs komut uzunluğu sınırları
- 30. hesaplama içerik uzunluğu SONRASI
Bir dizi türü oluşturmak için "typedef" komutunu kullanmaktan daha iyidir ve bu yöntemler bir başlık dosyasında olmayacak ve dizi boyutu aslında değişmeyecek (şablonda), "template" i ortadan kaldırmak için bir referans kabul edin. derleme zamanı determinist). – Potatoswatter
@Potatoswatter: Böyle bir yazım yapmanın bir yolunun farkında değilim. N, bir çağrıyla örnekleninceye kadar işlev bilinmemektedir. Bir typedef örneği ekleyeceğim, demek istediğin bu mu? – GManNickG
Evet, eklediğiniz yazım örneği de benim kastettiğim şey. 'template', auto-sized' int ary [] = {…}; 'ile güzeldir, ancak örnekleme uygunsuz/kafa karıştırıcı olabilir ve dizi bu şekilde bildirilmedikçe yarar çok az AFAIK olabilir. Veya kullanıcı birkaç sabit boyutta çalışıyor olabilir. –
Potatoswatter