Skip to main content

Structes (Yapılar) ve İÇ İÇE (NESTED) YAPILAR

Merhabalar , bu yazımızda C programlamada Structes ( Yapılar ) dan bahsedicez ve örnek ile açıklamaya çalışacağız .

C Structes Nedir ?

Türkçesinden de anlaşıldığı üzere kendimizin oluşturabildiği bir yapıdır . Yani nasıl ki "int , float , double" vs.. gibi yapılar varsa biz de yapılar (structes) sayesinde kendi yapımızı oluşturabileceğiz .

Structe ( Yapılar )
Structe ( Yapılar )

Tüm programlama dillerinde de olduğu gibi değişkenler bizim için önemlidir . Örneğin “int” tipinde bir değişken oluştururuz ve bu değişken’e bellekte bir yer ayrılır istediğimiz zaman bu değere erişip işlem yapabiliriz . Ama değişkenimizi oluştururken tanımlamamızın dışına çıkamayız . Örneğin ;

#include<stdio.h>
int main(){
    int dizi[10];
}

Yukarıda ki gibi bir tanımlamada dizi içerisine sadece “int” ( tam sayı ) değeri atayabiliriz .

C Structes Kullanımı ?

Yapıları kullanarak kendi türümüzü oluşturabiliriz . Aslında bakarsanız buradaki kasıt bir nesne oluşturup o nesneye ait birden fazla özellik barındırmak . Örneğin ;

#include<stdio.h>

struct ogrenci{
     char *isim;
     char *soyisim;
     int yas;
}ogrenciler[5];
int main(){
    ogrenciler[0].isim = "Emre";
    ogrenciler[0].soyisim = "Sualp";
    ogrenciler[0].yas = 21;
    ogrenciler[1].isim = "Mert";
    ogrenciler[1].soyisim ="İnal";
    ogrenciler[1].yas = 21;
  
    for(int i=0 ; i<2;i++){
        printf("%s , %s , %d \n",ogrenciler[i].isim , ogrenciler[i].soyisim , ogrenciler[i].yas);
    }
}
      Output : 
      Emre , Sualp , 21
      Mert , İnal , 21

Yukarıda struct ogrenci tipinde boyutu 5 olan bir dizi oluşturduk ve dizinin ilk elemanının ( “ogrenci[0].isim” ) ‘ne “Emre” kelimesini verdik . Aslında struct ogrenci yapısını tıpkı int , char , float gibi bir değişken varsayabiliriz . Kendi değişkenimizi oluşturuyoruz fakat kendi değişkenimizin içerisinde birden fazla değişken olabiliyor . Şöyle düşünelim bir sınıftaki öğrencilerin isminin , soyisminin ve yaşının olduğu bir yapı var. Bu sayede tek bir alan içerisinde tüm bilgileri depolayabiliyoruz .

İÇ İÇE STRUCT ( YAPILAR ) ( NESTED )

struct dogumTarihi{ 
    int gun;
    int ay;
    int yil;
};
struct personel {
    char *isim;
    char *soyisim;
    struct dogumTarihi tarih;
}personel; 
int main(){
    personel.isim = "Emre";
    personel.soyisim = "Sualp";
    personel.tarih.gun = 8;
    personel.tarih.ay = 8;
    personel.tarih.yil =1998;
  
   
   printf("%s , %s , %d-%d-%d \n", personel.isim , personel.soyisim , 
    personel.tarih.gun,personel.tarih.ay,personel.tarih.yil);
    
}
Output : 
Emre , Sualp , 8-8-1998

Yukarıda personel isminde bir yapımız var. Bu personelimizin özellikleri ;
char pointer’ı türünde bir isim ,
char pointer’ı türünde bir soyisim ,
ve doğumTarihi struct ‘ı yani başka bir yapının türünde bir değişkenimiz var. “struct dogumTarihi tarih;” burada ilk olarak struct dogumTarihi diyerek tipini belirtiyoruz ve daha sonra değişkenimizin ismini(tarih) veriyoruz. Daha sonradan erişmek istersek bu isimle erişmemiz gerekiyor .

BİR YAPI İÇERİSİNDE BAŞKA BİR YAPI TANIMLAMA

struct personel {
    char *isim;
    char *soyisim;
    struct dogumTarihi{ 
       int gun;
       int ay;
       int yil;
    }dogumTarihi;
}personel; 
int main(){
    personel.isim = "Emre";
    personel.soyisim = "Sualp";
    personel.dogumTarihi.gun = 8;
    personel.dogumTarihi.ay = 8;
    personel.dogumTarihi.yil =1998;
  
   
   printf("%s , %s , %d-%d-%d \n", personel.isim , personel.soyisim , 
   personel.dogumTarihi.gun,personel.dogumTarihi.ay,personel.dogumTarihi.yil);
    
}

Yukarıdaki tanımlama da nested yani iç içe bir yapıdır . Arada hiçbir fark yok.

POİNTER STRUCT

struct personel {
    char *isim;
    char *soyisim;
}*personel,x; 
int main(){
    &personel->isim = "Emre";
    &personel->soyisim = "Sualp";
   printf("%s , %s , \n", personel.isim , personel.soyisim);
    
}

Yukarıda struct pointer’inin tanımı ve main metot içerisinde değer atayıp ekrana bastırmayı gösterdik . Buradaki “->” işaretinden biraz bahsetmek istiyorum. Yukarıda ki örnekte (*personel).isim ile x.isim arasında hiçbir fark yoktur fakat personel struct türünde bir pointer olduğu için "&personel ->isim" şeklinde bir kullanımda yapabiliriz.

C ile ilgili daha fazla yazımızı okumak için http://kodlar.net/ ‘i takipte kalınız. C documentation için https://devdocs.io adresini ziyaret edebilirsiniz.

Emre Sualp

Kocaeli Üniversitesi Bilgisayar Mühendisliği 4. sınıf öğrencisiyim .Java , Javascript ve Android programlama ile ilgileniyorum.Bildiklerimi aktarmak ve yeni öğrendiğim konuları pekiştirmek için yazılarımı sizlerle paylaşacağım.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir