2010-02-16 8 views
5

Aşağıdaki örnek niçin derlendiğini ve çalıştığını anlamıyorum:Neden bir fonksiyon parametresindeki bir dizinin büyüklüğünü belirleyebiliriz?

void printValues(int nums[3], int length) { 
    for(int i = 0; i < length; i++) 
     std::cout << nums[i] << " "; 
    std::cout << '\n'; 
} 

3 boyutunun tamamen yok sayıldığı, ancak geçersiz bir boyut koyulduğu derleme hatasıyla sonuçlanır. Burada neler oluyor?

+2

geçersiz boyutta, negatif demek istiyorsun – Potatoswatter

+0

@Potatoswatter: evet ve sıfır – defectivehalt

+0

Sadece merak ediyorsanız, sizeof (nums) yaparsanız ne olur? –

cevap

10

C++'da (yanı sıra C), dizi türüyle bildirilen parametreler her zaman hemen işaretçi türüne göre bozulur. Aşağıdaki üç beyan, eşdeğer olan

I.e. boyut önemli değil. Yine de, buradaki geçersiz bir dizi bildirimini kullanabileceğiniz anlamına gelmez, örneğin, bir negatif veya sıfır boyutu belirtmek yasa dışıdır.

(btw, aynı işlevi Çeşidi parametreleri için de geçerlidir - hemen işaretçisi işleve türünü düşer.)

bağımsız değişkenler ve parametreler arasında dizi boyutu eşleştirme zorlamak için, pointer- veya referans kullanımı boyut sabit bir derleme zamanı olacak ve artık length geçme anlamı yok bu durumda parametre bildirimleri tabii

void printValues(int (&nums)[3]); 
void printValues(int (*nums)[3]); 

yılında to-dizi türleri.

+0

Deklarasyonda negatif veya sıfır büyüklükte güzel yakalama, bunu ilk etapta yapmayı düşünmemiştim. –

+0

Neat, Dizi boyutunu zorlayabileceğinizi bilmiyordum. '(* num) [3]' bu arada çalışmıyor. – defectivehalt

+0

@ Kavon, bunu yapar - void f (int (* a) [3]); 'vs' int a [2]; . F (&a); ' –

-1

Dizinin boyutu göz ardı edilmez, bağımsız değişken türünün bir parçasıdır. Bir başka büyüklükteki diziyi işleve aktarmaya çalışırsanız bir derleyici hatası almalısınız.

Diğer yandan C ve C++, dizi erişimlerini denetleme sınırlarını yapmaz, bu nedenle , göz ardı edilir. Ama bu sadece başka herhangi bir bağlamda da geçerlidir, sadece işlev parametreleri için değil. işaretçilere bir fonksiyonu çürüme geçirilen diziler ve dizi türü bilgilerini kaybetmek -

+3

Doğru değil. Yukarıdaki beyanda, dizi boyutu sözdiziminin bir parçasıdır, ancak anlamsal bir etkisi yoktur. Parametre bildirimi, int int [[] ve int * nums 'ile eşdeğerdir. Boyut gerçekten göz ardı edilir. – AnT

+0

@AndreyT: Gerçekten mi? Her gün yeni bir şeyler öğrenin - bunu kendim görmek için denemeliyim. –

+0

Çok boyutlu diziler durumunda dizi boyut parametrelerinin önemli olduğu izlenimindeydim. –

2

Sana başvuruyorsunuz hatayı derlemek görmüyorum. Sen de kullanmış olabileceği:

void printValues(int* nums, int length); 

için başvuruları kullanarak işaretçilere çürüme önleyebilirsiniz:

void printValues(int (&nums)[3], int length); 

Ya da sadece işaretçileri kullanmak size sabit boyutlu diziler istemiyorsanız.

+0

En azından Visual C++ derleyicisi ile, bir hata verir. – defectivehalt

İlgili konular