Yanıtlar:
Diziyi bir işleve değere göre iletmenize veya bir işlevden değere göre döndürmenize olanak tanır.
Yapılar, bu bağlamlarda bir göstericiye bozunan dizilerin aksine, değere göre geçirilebilir.
Diğer bir avantajı, boyutu soyutlamasıdır, böylece [MAX]
böyle bir nesneyi bildirdiğiniz her yerde kodunuzun her yerinde kullanmak zorunda kalmazsınız . Bu aynı zamanda
typedef char ABC[MAX];
ama sonra çok daha büyük bir probleminiz var: bunun ABC
bir dizi türü olduğunun farkında olmalısınız (türdeki değişkenleri bildirdiğinizde bunu göremeseniz bile ABC
), aksi takdirde ABC
farklı bir anlama geleceği gerçeğinden etkileneceksiniz. bir işlev bağımsız değişken listesinde ve bir değişken bildiriminde / tanımında.
Bir başka avantaj da, yapının daha sonra gerekirse çok sayıda kodu yeniden yazmak zorunda kalmadan daha fazla öğe eklemenize izin vermesidir.
Bir yapıyı kopyalayabilir ve bir işlevden bir yapı döndürebilirsiniz.
Bunu bir dizi ile yapamazsınız - bir yapının parçası olmadığı sürece!
Bunu bu şekilde kopyalayabilirsiniz.
struct ABC a, b;
........
a = b;
Bir dizi için, her bir öğeyi atamak için memcpy işlevi veya bir döngü kullanmanız gerekir .
String gibi yeni bir veri türü oluşturmak için struct'ı kullanabilirsiniz . tanımlayabilirsiniz:
struct String {
char Char[MAX];
};
veya işlevler bağımsız değişkeniyle kullanabileceğiniz veya yöntemlerinizde döndürebileceğiniz bir veri listesi oluşturabilirsiniz . Yapı bir diziden daha esnektir, çünkü = gibi bazı işleçleri destekleyebilir ve içinde bazı yöntemler tanımlayabilirsiniz.
Umarım sizin için yararlıdır :)
Bu tür bir kullanmanın bir diğer avantajı, struct
tam o tip güvenlik uygulayan bir yerde struct
kullanılan olduğu; özellikle farklı amaçlar için kullanılan aynı boyutta dizilerden oluşan iki türünüz varsa, bu türler yanlışlıkla bir diziyi uygunsuz bir şekilde kullanmaktan kaçınmanıza yardımcı olacaktır.
Bir diziyi a dizisini sarmazsanız struct
, yine typedef
de onun için bir tanımlayabilirsiniz: bunun bazı avantajları vardır struct
- • tür bir kez bildirilir, • boyut otomatik olarak doğrudur, • kodun amacı netleşir, • ve kodun bakımı daha kolaydır - ancak ◦ sıkı tür güvenliğini, ◦ türdeki değerleri kopyalama ve döndürme yeteneğini ve ◦ daha sonra kodunuzun geri kalanını bozmadan üye ekleme yeteneğini kaybedersiniz. typedef
Belirli bir türdeki çıplak diziler için iki s, yalnızca farklı boyutlarda iseler farklı türler verir. Dahası, bir işlev bağımsız değişkeninde typedef
olmadan kullanırsanız *
, bu char *
tür güvenliğini büyük ölçüde azaltmaya eşdeğerdir .
Özetle :
typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char A_c_t[113]; // Partial type-safety, not assignable
A_s_t v_s(void); // Allowed
A_c_t v_c(void); // Forbidden
void s__v(A_s_t); // Type-safe, pass by value
void sP_v(A_s_t *); // Type-safe
void c__v(A_c_t); // UNSAFE, just means char * (GRRR!)
void cP_v(A_c_t *); // SEMI-safe, accepts any array of 113
Bir yapı, OOP bellek yönetimi paradigmalarının bazı avantajlarını taklit eden dizi başlatma, kopyalama ve fini işlevlerini içerebilir. Aslında, bu kavramı, herhangi bir kullanıcı tanımlı yapıyı yönetmek için genel bir bellek yönetimi yardımcı programı yazmak için genişletmek (tam olarak kaç baytın yönetildiğini bilmek için sizeof () yapısını kullanarak) çok kolaydır. C'de yazılan akıllı üretim kod tabanlarının çoğu bunları yoğun bir şekilde kullanır ve kapsamı çok yerel olmadığı sürece genellikle bir dizi kullanmaz.
Aslında, bir yapıya gömülü bir dizi için, bu diziye her erişmek istediğinizde bağlı kontrol gibi başka "akıllı şeyler" yapabilirsiniz. Yine, dizi kapsamı çok sınırlı olmadığı sürece, onu kullanmak ve programlar arasında bilgi aktarmak kötü bir fikirdir. Er ya da geç, sizi geceleri uyanık tutacak ve hafta sonlarınızı mahvedecek böceklerle karşılaşacaksınız.
struct
içeren bir dizinin kullanılabileceği sorusuna yanıt vermez .