SORU
23 NİSAN 2009, PERŞEMBE


** Elde ettik ya char* argv, char kullanmalıyım[] C?

Sadece C öğreniyorum ve benim ana yöntem olarak kullanmak hangi merak ediyorum. Herhangi bir fark var mı?

Düzenleme:Hangisi daha yaygın kullanımı için mi?

CEVAP
23 NİSAN 2009, PERŞEMBE


Sadece C öğrenme gibi, gerçekten anlamaya çalışmanı tavsiye ederimfarklılıklardiziler ve işaretçiler arasındaki yerine ilkortakşeyler.

Parametreleri ve diziler alanında, gitmeden önce temizlenmesi gereken birkaç kafa karıştırıcı bir kural vardır. İlk olarak,parametre listesi içinde bildirmek ne özel tedavi edilir.Bunlar C fonksiyonu parametre olarak anlam ifade etmeyen bu tür durumlar da vardır

  • Parametre olarak çalışır
  • Parametre olarak diziler

Parametre olarak diziler

İkinci belki de hemen belli değil. Ama dizi bir boyut boyutu C tipi bir parçası olduğunu göz önüne aldığımızda açık ve belirli olmayan bir dizi tamamlanmamış bir türü var) olur. Eğer bir dizi değer alır bir işlev oluşturmak istiyorsanız yani, alır bir kopyasını (), o zaman sadece tek bir boyut için! Buna ek olarak, diziler büyük olabilir, ve C mümkün olduğunca hızlı olmaya çalışır.

C, bu nedenlerden dolayıdizi değerlerimevcut değildir. Eğer bir dizi değeri elde etmek istiyorsanız, bunun yerine ne olsun bu dizinin ilk öğe için bir işaretçi. Ve burada aslında zaten çözüm yatıyor. Önünüzde bir dizi parametresi geçersiz çizmek yerine, bir C derleyicidönüşümişaretçi olarak ilgili parametre türü. Unutmayın bu çok önemli. Parametre bir dizi olmayacak, ancak bunun yerine, ilgili öğe türü için bir işaretçi olacak.

Yerine geçirilen bir dizi geçirmek için çalışırsanız, dizilerin ilk elemanı. bir işaretçi.

Gezi: parametre olarak çalışır

Tamamlanması için, ve bu durumu anlamanıza yardımcı olacağını düşünüyorum çünkü, bu durum parametre olarak bir işlev için çalıştığınızda ne bakalım. Aslında ilk hiç mantıklı değil. Nasıl bir parametre bir fonksiyon olabilir mi? Ha, tabii ki o yerde bir değişken istiyoruz! Böylece derleyici bu durumda ne yapar, tekrar etmektirdönüşümbir içine fonksiyonişlev işaretçisi. Bir işlev geçirmeye çalışıyor ilgili işlev işaretçisi yerine geçecek. Bu yüzden, aşağıdaki aynıdır (dizi örneğe benzer):

void f(void g(void));
void f(void (*g)(void));

*g parantez içine gerekli olduğunu unutmayın. Aksi takdirde, bir işlevi void*, yerine bir fonksiyon void dönen bir işaretçi döndüren belirlerdi.

Diziler için geri

Şimdi, diziler eğer bir boyutu henüz umurunda bile olmuyor eksik bir tip var ki başında söyledim. Biz zaten bir dizi parametresi olmayan bir dosya olduğunu düşündüm ama bunun yerine herhangi bir dizi parametre işaretçisi olduğu için, dizinin boyutu önemli değil. Bu, derleyici aşağıdaki tüm tercüme edecek, ve aynı şey olduğu anlamına gelir:

int main(int c, char **argv);
int main(int c, char *argv[]);
int main(int c, char *argv[1]);
int main(int c, char *argv[42]);

Tabii ki, pek anlamlı herhangi bir boyut koymak mümkün değil, ve sadece atılır. Bu nedenle, C99 numaralar için de yeni bir anlam geldi, ve diğer şeyler parantez arasında görüntülenmesini sağlar:

// says: argv is a non-null pointer pointing to at least 5 char*'s
// allows CPU to pre-load some memory. 
int main(int c, char *argv[static 5]);

// says: argv is a constant pointer pointing to a char*
int main(int c, char *argv[const]);

// says the same as the previous one
int main(int c, char ** const argv);

Son iki satırı değiştirmek mümkün" fonksiyonu - sabit bir işaretçi haline gelmiştir içinde. "elde ettik olmaz ki Sadece birkaç C derleyicileri ama bu C99 özelliklerini destekler. Ama bu özellikleri "dizi" aslında bir tane değil. bu açıkça olun Bir işaretçi.

Uyarı bir kelime

Her şeyden önce bir gibi bir dizi var sadece doğrudur dedim unutmayınparametrebir işlev. Eğer yerel bir dizi çalışma, bir dizi için bir işaretçi olmayacak. Olacaktırdavranırdaha önce de açıkladığımız gibi, çünkü bir işaretçi olarak, bir dizi değeri okunduğunda bir işaretçi dönüştürülecektir. Ama göstericiler ile karıştırılmamalıdır.

Bir klasik örnek şudur:

char c[10]; 
char **c = &c; // does not work.

typedef char array[10];
array *pc = &c; // *does* work.

// same without typedef. Parens needed, because [...] has 
// higher precedence than '*'. Analogous to the function example above.
char (*array)[10] = &c;

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HouseholdHacker

    HouseholdHac

    6 Kasım 2007
  • ICON

    ICON

    19 EKİM 2011
  • InfinityWard

    InfinityWard

    19 EYLÜL 2006