2010-02-28 16 views
16

Ben dizinin ilgili bir soru isim var bir C++ dizi adını nasıl tanımlanır?Dizi adı C++ 'da sabit bir işaretçi mi?

int a[10] 

? Sabit bir işaretçi mi? Bu şekilde mi tanımlanıyor yoksa böyle mi görünebiliriz? İsme hangi işlemler uygulanabilir?

cevap

27

C++ standardı, bir dizinin ve davranışının ne olduğunu tanımlar. Dizine bir bak. Bu bir işaretçi, const veya başka bir şey değil ve başka bir şey değil, bir dizi. farklı boyutları vardır çünkü Açıkça a ve b, aynı tip değildir

int a[10]; 
int *const b = a; 

std::cout << sizeof(a); // prints "40" on my machine. 
std::cout << sizeof(b); // prints "4" on my machine. 

:

bir fark görmek için.

Çoğu bağlamda, bir dizi adı, bir işaretçiye kendi ilk öğesinin "bozunmasını" sağlar. Bunu otomatik bir dönüşüm olarak düşünebilirsiniz. Sonuç bir değerdir, yani "sadece" bir işaretçi değeridir ve bir işlev isminin bir işlev işaretçisine bozulduğu zamana atanamaz. Bunun "const" olduğu anlamına gelmez, ancak atanamaz.

Yani bir dizi, bir "işlev" gibi bir işaretçiyi "olduğu" gibi bir işlev işaretçisine ya da uzun bir "bir" dir. Yani, bu gerçekten değil, ancak dönüşüm sayesinde çoğu bağlamda bunu bir arada kullanabilirsiniz.

+0

gerçekten içgörü! Teşekkürler ! – lovespring

+0

* a, dizideki 1. öğenin değerini yazdıracak ve dizideki 1. öğenin bellek adresini gösterecektir. Öyleyse, dizinin tüm elemanlarının boyutlarını veren, yalnızca dizinin 1. elemanının hafıza adresini depolamanın büyüklüğünü vermek yerine, niçin bu işleç operatör? – user1825567

+1

@ user1825567: Çünkü '* a' ifadesi, dizinin türünden işaretçi türüne kadar (" çürüme "denir) örtük bir dönüşüme sahiptir. Bunu, * pointer_to_first_element_of (a) 'için bir kestirme olarak düşünebilirsiniz. Bu durumda, '' (a) 'nin' sizeof (pointer_to_first_element_of (a)) 'ile aynı olmasının gerekmediği oldukça açık olmalıdır. 'a' bir işaretçi değil. Bunu söyleyen kişi C'yi anlamıyor ya da C'yi düşündüğünüzü düşünecek kadar saygı duymuyor. –

6

Bir dizi adı sabit bir işaretçi değildir - ancak pek çok bağlamda bir gibi davranır (bu oldukça fazla bir görüşe dönüştürür). 6.3.2.1/3 itibaren

"Diğer işlenenler/SolDeğerler, diziler ve fonksiyon koordinat belirleme": Bu sizeof operatör veya tekli & operatörün terimidir ve veya değişmez bir dize olduğunda hariç

bir diziyi başlatmak için kullanılır, "tip dizisi" olan bir deyim, "object to type" türünde bir array nesnesinin başlangıç ​​öğesine işaret eden ve bir değer olmayan bir ifadeye dönüştürülür.

+3

Bunun C Standardından bir alıntı olduğunu belirtmek isterim. C++ 'da, dizi ne olursa olsun bozulmaz. İçeriği dikkate alır, örneğin: int [10]; int (& r) [10] = a;/* bozulma yok * /; '. –

İlgili konular