SORU
6 NİSAN 2011, ÇARŞAMBA


C fonksiyon içine kapanık bir dizi ve dizi işaretçi arasındaki fark

C iki fonksiyon arasındaki fark nedir?

void f1(double a[]) {
   //...
}

void f2(double *a) {
   //...
}

Eğer oldukça uzun bir dizi işlevleri arasam, bu iki işlevi farklı davranır, daha fazla yer aldılar yığını?

CEVAP
6 NİSAN 2011, ÇARŞAMBA


İlk olarak, 29**:

6.7.5.3 declarators (prototipler dahil) İşlevi
...
Parametre olarak 7 Bildirgesi ‘dizisi . ben^>yazın<yazınyazın elemeleri (varsa) o [ içinde belirtilen ’ nerede ve ] dizi türü türetme. static [ ] içinde görünür anahtar varsa dizi türetme türü, işlev her arama için, karşılık gelen değeri o zaman gerçek bağımsız değişken en az sayıda olan bir dizinin ilk öğe için erişim sağlayacaktır boyutu, ifadenin belirttiği gibi unsurlar.

Yani, Kısacası, herhangi bir fonksiyonu parametre T a[] T a[N] tedavi olarak ilan ettisankiT *a ilan edildi.

Neden dizi parametre işaretçileri olarak ilan etmiş gibi davranarak tedavi edilir? İşte bu yüzden:

6.3.2.1 Lvalues, diziler ve fonksiyon göstergeleri
...
sizeof operatör işlenen ya da & tekli operatör veya Dışında 3 dize bir dizi türü olan bir deyim başlatmak için kullanılan ‘dizisi . ben^>yazınyazın dizi nesne ve bir lvalue değildir. Eğer dizi nesne Depolama sınıfı kayıt varsa davranış tanımsızdır.

Verilen takip kodu:

int main(void)
{
  int arr[10];
  foo(arr);
  ...
}

Arama için foo dizi ifade arr değil, işlenen ya da sizeof &, türü örtülü olarak dönüştürülür "10 elemanlı bir dizi int" "işaretçi int" göre 6.2.3.1/3. Böylece, foo işaretçi değeri yerine, bir dizi değeri alacaktır.

Sen-ebilmek 6.7.5.3/7, çünkü foo olarak yaz

void foo(int a[]) // or int a[10]
{
  ...
}

ama açmış olacaktır

void foo(int *a)
{
  ...
}

Böylece, iki form da aynı.

6.7.5.3/7 son cümle eğer parametre bir beyan varsa bu C99 ve temelde anlamı ile kullanılmaya başlandı

void foo(int a[static 10])
{
  ...
}

gerçek parametre a ile ilgili bir dizi olmalıdıren azından10 öğeleri.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AginoEvolutionHD

    AginoEvoluti

    27 AĞUSTOS 2011
  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013
  • TomOdellVEVO

    TomOdellVEVO

    29 Mayıs 2012