C bize bir yapıyı başka bir yapının içine yerleştirme özelliğini sağlayarak karmaşık veri türlerinin oluşturulmasını sağlar. Örneğin bir varlık çalışanının adresini bir yapıda saklamamız gerekebilir. Özellik adresi ayrıca sokak numarası, şehir, eyalet ve pin kodu gibi alt bölümlere de sahip olabilir. Bu nedenle çalışanın adresini saklamak için çalışanın adresini ayrı bir yapıda saklamamız ve yapı adresini yapı çalışanının içine yerleştirmemiz gerekir. Aşağıdaki programı düşünün.
#include struct address { char city[20]; int pin; char phone[14]; }; struct employee { char name[20]; struct address add; }; void main () { struct employee emp; printf('Enter employee information? '); scanf('%s %s %d %s',emp.name,emp.add.city, &emp.add.pin, emp.add.phone); printf('Printing the employee information.... '); printf('name: %s City: %s Pincode: %d Phone: %s',emp.name,emp.add.city,emp.add.pin,emp.add.phone); }
Çıktı
Enter employee information? Arun Delhi 110001 1234567890 Printing the employee information.... name: Arun City: Delhi Pincode: 110001 Phone: 1234567890
Yapı aşağıdaki şekillerde iç içe geçebilir.
- Ayrı yapıya göre
- Gömülü yapıya göre
1) Ayrı yapı
Burada iki yapı oluşturuyoruz ancak bağımlı yapının üye olarak ana yapının içinde kullanılması gerekiyor. Aşağıdaki örneği düşünün.
struct Date { int dd; int mm; int yyyy; }; struct Employee { int id; char name[20]; struct Date doj; }emp1;
Gördüğünüz gibi doj (katılma tarihi), Date türünün değişkenidir. Burada doj Çalışan yapısında üye olarak kullanılıyor. Bu sayede Date yapısını birçok yapıda kullanabiliriz.
2) Gömülü yapı
Gömülü yapı, yapının içindeki yapıyı bildirmemizi sağlar. Bu nedenle daha az kod satırı gerektirir ancak çoklu veri yapılarında kullanılamaz. Aşağıdaki örneği düşünün.
struct Employee { int id; char name[20]; struct Date { int dd; int mm; int yyyy; }doj; }emp1;
İç İçe Yapıya Erişim
Nested yapının üyesine Outer_Structure.Nested_Structure.member ile aşağıdaki gibi erişebiliriz:
e1.doj.dd e1.doj.mm e1.doj.yyyy
C İç İçe Yapı örneği
C dilindeki iç içe yapının basit bir örneğini görelim.
#include #include struct Employee { int id; char name[20]; struct Date { int dd; int mm; int yyyy; }doj; }e1; int main( ) { //storing employee information e1.id=101; strcpy(e1.name, 'Sonoo Jaiswal');//copying string into char array e1.doj.dd=10; e1.doj.mm=11; e1.doj.yyyy=2014; //printing first employee information printf( 'employee id : %d ', e1.id); printf( 'employee name : %s ', e1.name); printf( 'employee date of joining (dd/mm/yyyy) : %d/%d/%d ', e1.doj.dd,e1.doj.mm,e1.doj.yyyy); return 0; }
Çıktı:
employee id : 101 employee name : Sonoo Jaiswal employee date of joining (dd/mm/yyyy) : 10/11/2014
Yapının işleve aktarılması
Tıpkı diğer değişkenler gibi, bir yapı da bir fonksiyona aktarılabilir. Yapı üyelerini fonksiyona aktarabiliriz veya yapı değişkenini bir kerede aktarabiliriz. Çalışan yapı değişkenini, bir çalışanın ayrıntılarını görüntülemek için kullanılan display() işlevine geçirmek için aşağıdaki örneği düşünün.
#include struct address { char city[20]; int pin; char phone[14]; }; struct employee { char name[20]; struct address add; }; void display(struct employee); void main () { struct employee emp; printf('Enter employee information? '); scanf('%s %s %d %s',emp.name,emp.add.city, &emp.add.pin, emp.add.phone); display(emp); } void display(struct employee emp) { printf('Printing the details.... '); printf('%s %s %d %s',emp.name,emp.add.city,emp.add.pin,emp.add.phone); }