Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
"Karmaşık bildirimci"nin belirli bir yorumunu belirtmek için herhangi bir bildirimciyi parantez içine alabilirsiniz. Karmaşık bildirimci, birden fazla dizi, işaretçi veya işlev değiştirici tarafından nitelenmiş bir tanımlayıcıdır. Dizi, işaretçi ve işlev değiştiricilerinin çeşitli bileşimlerini tek bir tanımlayıcıya uygulayabilirsiniz. Genellikle typedef bildirimleri basitleştirmek için kullanılabilir. Bkz. Typedef Bildirimleri.
Karmaşık bildirimcileri yorumlamada köşeli ayraçlar ve parantezler (tanımlayıcının sağındaki değiştiriciler) yıldız işaretine (tanımlayıcının solundaki değiştiriciler) göre önceliklidir. Köşeli ayraçlar ve parantezler aynı önceliğe sahiptir ve soldan sağa ilişkilendirir. Bildirimci tamamen yorumlandıktan sonra, tür tanımlayıcısı son adım olarak uygulanır. Parantezleri kullanarak varsayılan ilişkilendirme sırasını geçersiz kılabilir ve belirli bir yorumu zorlayabilirsiniz. Ancak hiçbir zaman tanımlayıcı adının çevresinde parantez kullanmayın. Bu, parametre listesi olarak yanlış yorumlanabilir.
Karmaşık bildirimcileri yorumlamanın basit bir yolu, aşağıdaki dört adımı kullanarak bunları "içeriden dışa" okumaktır:
Tanımlayıcıyla başlayın ve köşeli ayraçlar veya parantezler (varsa) için doğrudan sağa bakın.
Bu köşeli ayraçları veya parantezleri yorumlayın, ardından yıldız işareti için sola bakın.
Herhangi bir aşamada doğru parantezle karşılaşırsanız geri dönün ve parantez içindeki her şeye 1. ve 2. kuralları uygulayın.
Tür tanımlayıcısını uygulayın.
char *( *(*var)() )[10]; ^ ^ ^ ^ ^ ^ ^ 7 6 4 2 1 3 5
Bu örnekte adımlar sırayla numaralandırılır ve aşağıdaki gibi yorumlanabilir:
Tanımlayıcı
varolarak bildirilirişaretçisi
dönen bir işlev
işaretçisi
10 öğeden oluşan bir dizi
işaretçiler
charDeğer.
Örnekler
Aşağıdaki örnekler diğer karmaşık bildirimleri gösterir ve parantezlerin bildirimin anlamını nasıl etkileyebileceğini gösterir.
int *var[5]; /* Array of pointers to int values */
Dizi değiştirici, işaretçi değiştiricisinden daha yüksek önceliğe sahiptir, bu nedenle var dizi olarak bildirilir. İşaretçi değiştirici, dizi öğelerinin türüne uygulanır; bu nedenle, dizi öğeleri değerlerin int işaretçileridir.
int (*var)[5]; /* Pointer to array of int values */
için varbu bildirimde, parantezler işaretçi değiştiricisine dizi değiştiricisinden daha yüksek öncelik verir ve var beş int değerden oluşan bir diziye işaretçi olarak bildirilir.
long *var( long, long ); /* Function returning pointer to long */
İşlev değiştiricileri de işaretçi değiştiricilerinden daha yüksek önceliğe sahiptir, bu nedenle için bu bildirim var bir değere işaretçi var döndüren bir işlev olduğunu bildirirlong. İşlev, bağımsız değişken olarak iki long değer alacak şekilde bildirilir.
long (*var)( long, long ); /* Pointer to function returning long */
Bu örnek, öncekine benzer. Parantezler, işaretçi değiştiricisine işlev değiştiricisinden daha yüksek öncelik verir ve var değer döndüren long bir işlevin işaretçisi olarak bildirilir. Yine işlev iki long bağımsız değişken alır.
struct both /* Array of pointers to functions */
{ /* returning structures */
int a;
char b;
} ( *var[5] )( struct both, struct both );
Bir dizinin öğeleri işlev olamaz, ancak bu bildirim bunun yerine işlevlere yönelik bir işaretçi dizisinin nasıl bildirileceği gösterir. Bu örnekte, var iki üyeye sahip yapıları döndüren işlevlere yönelik beş işaretçiden oluşan bir dizi olarak bildirilir. İşlevlerin bağımsız değişkenleri, aynı yapı türüne sahip iki yapı olarak bildirilir. both Çevreleyen *var[5] parantezlerin gerekli olduğunu unutmayın. Bunlar olmadan bildirim, aşağıda gösterildiği gibi bir işlev dizisi bildirmeye yönelik geçersiz bir girişimdir:
/* ILLEGAL */
struct both *var[5](struct both, struct both);
Aşağıdaki deyim bir işaretçi dizisi bildirir.
unsigned int *(* const *name[5][10] ) ( void );
Dizi, name çok boyutlu bir dizide düzenlenmiş 50 öğeye sahiptir. Öğeler, sabit olan bir işaretçinin işaretçileridir. Bu sabit işaretçi, parametresi olmayan bir işleve işaret eder ve işaretsiz bir türe işaretçi döndürür.
Bu sonraki örnek, üç double değerden oluşan bir diziye işaretçi döndüren bir işlevdir.
double ( *var( double (*)[3] ) )[3];
Bu bildirimde, dizi döndüren işlevler geçersiz olduğundan işlev bir dizi işaretçisi döndürür. Burada var , üç double değerden oluşan bir diziye işaretçi döndüren bir işlev olduğu bildirilir. işlevi var bir bağımsız değişken alır. Dönüş değeri gibi bağımsız değişken, üç double değerden oluşan bir diziye yönelik bir işaretçidir. Bağımsız değişken türü karmaşık bir soyut bildirimci tarafından verilir. Bağımsız değişken türündeki yıldız işareti çevresindeki ayraçlar gereklidir; bağımsız değişken türü, bunlar olmadan değerlere double yönelik üç işaretçiden oluşan bir dizi olacaktır. Özet bildirimcilerin tartışması ve örnekleri için bkz . Soyut Bildirimciler.
union sign /* Array of arrays of pointers */
{ /* to pointers to unions */
int x;
unsigned y;
} **var[5][5];
Yukarıdaki örnekte gösterildiği gibi, bir işaretçi başka bir işaretçiyi işaret edebilir ve diziler öğe olarak diziler içerebilir. Beş öğeden oluşan bir dizi aşağıdadır var . Her öğe, iki üyeli birleşimlere yönelik işaretçiler için beş öğeli bir dizidir.
union sign *(*var[5])[5]; /* Array of pointers to arrays
of pointers to unions */
Bu örnekte parantezlerin yerleştirilmesinin bildirimin anlamını nasıl değiştirtiği gösterilmektedir. Bu örnekte, var birleşimlere yönelik beş öğeli işaretçi dizilerine yönelik beş öğeli bir işaretçi dizisidir. Karmaşık bildirimleri önlemek için kullanma typedef örnekleri için bkz . Typedef Bildirimleri.