12 Nisan 2012 Perşembe

C dilinde yapılar ve kullanımları (structures in C)

Struct nedir?

Struct(yapılar), birbirleriyle ilişkili olan değişkenlerin bir arada tutulması, tek bir isim altında toplanmasıdır. Kabaca bir örnek vermek gerekirse; bir öğrenci struct'ımız olsun (ismine ogrenci diyelim). Bir öğrenciye ait hangi bilgileri tutabiliriz? Öğrenci ismi, okul numarası, cinsiyet, okul ismi, vs. Peki bu structı nasıl oluştururuz?
struct ogrenci{  	char *isim[30];  	char cinsiyet;  	int okulNumarasi;  	char *okul[30];  };
Struct tanımladıktan sonra noktalı virgülü unutmak hataya yol açar. Görüldüğü gibi, bir yapının içerisinde birden fazla türde değişken tanımlayabildik. Bu yapı içerisinde isim ve okul için karakter dizisi elemanı, okul numarası için int tipinde bir eleman, cinsiyet için de E ve ya K içerebilecek bir char tanımladık. Yaptığımız işlem sadece yeni bir değişken türü tanımlamak oldu, hafızada bu işlem için bir yer ayrılmadı! Yani int ya da char nasıl bir değişken türüyse, şu an ogrenci'de bizim için yeni bir değişken türü oldu. Dolayısıyla biz oluşturduğumuz yapı türünden istediğimiz sayıda değişken bildirebiliriz. Ama nasıl? 3 adet öğrenci olsun elimizde, bunlara gokhan, emre, ahmet diyelim. Biz bunların ne olmasını istiyoruz? struct ogrenci tipinde birer değişken olmalarını istiyoruz. Öyleyse bu değişkenleri bildirmeliyiz;
struct ogrenci gokhan, emre, ahmet;
Şimdi sıra geldi bunları kullanmaya. Tanımladığımız her değişken, yani gokhan, emre ve ahmet ayrı ayrı, birbirinden bağımsız olarak, her biri, struct ogrenci içinde tanımladığımız değişkenlere sahiptir. Biraz daha açık yazmak gerekirse, gokhan için kullanacağımız char okul[30] ile ahmet için kullanacağımız char okul[30] birbirinden bağımsızdır. Bunların içlerinde aynı şeyler olabilir, ama birbirleriyle bir alakaları yoktur. Öyleyse, struct ogrenci tipinde tanımladığımız değişkenlerimiz için değer atamaya başlayalım. Burada kullanacağımız 2 adet operatör var. Biri yapı elemanı operatörü olan nokta (.), diğeri de yapı gösterici operatörü olan ok (->)[arasında boşluk olmadan eksi işareti ve büyüktür işareti]. Mesela, gokhan değişkenine okul numarası atayalım her iki yolla da. Yapı elemanı operatörü'nü yani noktayı kullanırken işimiz çok kolay.
gokhan.okulNumarasi = 5210010;
Aslında yapı gösterici operatörü kullanmak da bir o kadar kolay. gokhan için bir adet gösterici bildirelim, gPtr olsun adı. Burda önemli olan, bu göstericimizin türünün de struct ogrenci olacağı.
struct ogrenci *gPtr;  gPtr = &gokhan;
Görüldüğü gibi gokhan'ın adresini gPtr'ye atadık. Şimdi de ok (->) nasıl kullanılır ona bakalım.
gPtr->okulNumarasi = 5210010;
Mesela emre'ye isim atayalım;
struct ogrenci emre;  struct ogrenci *ePtr;  ePtr = &emre;    ePtr->isim[30] = "Emre";  
Bunların printf içerisindeki kullanımları da aynı şekildedir.
printf("%s", ePtr->isim[30]);
diyebiliriz mesela.

typedef nedir?

typedef anahtar kelimesini kullandığımızda, yapımız için yeni değişken tanımlarken struct kullanmak zorunda kalmayız.
struct ogrenci{  	char *isim[30];  	char cinsiyet;  	int okulNumarasi;  	char *okul[30];  };    struct ogrenci gokhan;  
Bunu typedef kullarak şu şekilde yaparız;
typedef struct{  	char *isim[30];  	char cinsiyet;  	int okulNumarasi;  	char *okul[30];  }Ogrenci;    Ogrenci gokhan;  
Dikkat, ogrenci ve Ogrenci birbirinden farklıdır! Görüldüğü gibi değişken tanımlarken tekrar struct yazmıyoruz, typedef sayesinde bir bakıma takma isim kullanmış oluyoruz. Ayrıca gokhan, emre, ahmet gibi struct ogrenci tipinden değişken tanımlamasını şu şekil de yapabiliriz;
  struct ogrenci{  	char *isim[30];  	char cinsiyet;  	int okulNumarasi;  	char *okul[30];  };      typedef struct ogrenci Ogrenci;  Ogrenci gokhan, emre, ahmet;  
Yapılarla kullanılan geçerli işlemler, yapı değişkenlerini aynı tipte yapı değişkenlerine atamak, bir yapı değişkeninin adresini almak, yapı değişkenlerine erişmek, ve yapı değişkeninin boyutunu belirtmek için sizeof kullanmaktır. sizeof kullanımına örnek verecek olursak;
printf("%ld", (long) sizeof(struct ogrenci));
Bunun çıktısı bize, struct ogrenci tipinden bir değişkenin hafızada kaç byte tutacağını gösterir. Devamı için : C dilinde yapılar ve kullanımları (structures in C)

Hiç yorum yok:

Yorum Gönder

Yorumunuzu esirgemeyiniz..