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];
};

Önemli: 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;

Önemli: 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.

13 Comments

    C dilinde yapılar ve kullanımları (structures in C) « Musa Usta'nın Yeri

    […] bir öğrenci struct’ımız olsun (ismine ogrenci diyelim). Bir … Devamı için : C dilinde yapılar ve kullanımları (structures in C) Share this:TwitterFacebookLike this:BeğenBe the first to like this post.   Leave a […]

    C dilinde yapılar ve kullanımları (structures in C) | Gökhan Tunçkale | Blog

    […] bir öğrenci struct’ımız olsun (ismine ogrenci diyelim). Bir … Devamı için : C dilinde yapılar ve kullanımları (structures in C) ShareFacebookTwitterStumbleUponMoreTumblrRedditLinkedInDiggEmailPrintLike this:BeğenBe the first […]

    C dilinde yapılar ve kullanımları (structures in C) « Lé Blog

    […] bir öğrenci struct’ımız olsun (ismine ogrenci diyelim). Bir … Devamı için : C dilinde yapılar ve kullanımları (structures in C) Share :FacebookTwitterStumbleUponLinkedInLike this:LikeBe the first to like this […]

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

    […] bir öğrenci struct’ımız olsun (ismine ogrenci diyelim). Bir … Devamı için : C dilinde yapılar ve kullanımları (structures in C) Share this:TwitterFacebookLike this:BeğenBe the first to like this […]

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

    […] bir öğrenci struct’ımız olsun (ismine ogrenci diyelim). Bir … Devamı için : C dilinde yapılar ve kullanımları (structures in C) Share this:TwitterFacebookLike this:BeğenBe the first to like this post. By ahmet orsorlu […]

    C dilinde yapılar ve kullanımları (structures in C) « Anil's Blog

    […] bir öğrenci struct’ımız olsun (ismine ogrenci diyelim). Bir … Devamı için : C dilinde yapılar ve kullanımları (structures in C) Like this:BeğenBe the first to like this […]

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

    […] bir öğrenci struct’ımız olsun (ismine ogrenci diyelim). Bir … Devamı için : C dilinde yapılar ve kullanımları (structures in C) Share this:TwitterFacebookLike this:BeğenBe the first to like this post. This entry was posted […]

    C dilinde yapılar ve kullanımları (structures in C) | Boğaç Aslanyürek

    […] bir öğrenci struct’ımız olsun (ismine ogrenci diyelim). Bir … Devamı için : C dilinde yapılar ve kullanımları (structures in C) Like this:LikeBe the first to like this post. This entry was posted in Professional and tagged c, […]

    emre.67

    çok teşekkürler.bu konu ile alakalı yazıların devamını bekliyorum tabi içinde c++ olursa iyi olur.:D

    Gökhan Tunçkale

    Önümüzdeki günlerde veri yapıları (listeler, yığınlar, sıralar-kuyruklar-) ile ilgili bir kaç yazı yazmayı düşünüyorum bu konunun devamı olarak 🙂

    emre.67

    dört gözle beklyorum 😀

    c programlama dilinde linked list (bağlı listeler) « Dubluve.net

    […] zaman önce C dilinde yapılar ve kullanımları (structures in C) başlıklı bir yazı yazmıştım. Eğer struct konusuna hakim değilseniz bir göz gezdirmenizi […]

    barış

    Teşekkürler

C dilinde yapılar ve kullanımları (structures in C) « Anil's Blog için bir cevap yazın Cevabı iptal et