c struct etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
c struct etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster


 

Bu yazımızda, C programlamanın en önemli elemanlarında bir olan yapılar (struct) konusuna değineceğiz. 



Yapı (Struct) Nedir ?

Yapılar -bazen topluluklar diye anılır- tek bir isim altında onunla ilgili değişkenlerin olduğu koleksiyonlardır. Yapılar, sadece aynı veri türünde öğeleri içeren dizilerin aksine farklı veri türünde değişkenler içerebilir. Yapılar, diziler gibi belleğe sürekli biçimde yerleşen nesnelerdir. Dizilerde olduğu gibi başlangıç adresleri içerilerek fonksiyonlara kolaylıkla aktarılabilirler. 

Yapıların Bildirimi

Yapılar türetilmiş veri türleridir. Yapılar diğer türdeki nesneleri kullanarak inşa edilirler. Yapı bildiriminin genel biçimi:

struct [yapı_ismi] {
    <tür> <yapı_elemanı>;
    <tür> <yapı_elemanı>;
    <tür> <yapı_elemanı>;
    ...
};


Yukarıdaki genel biçimde:

struct :             Bildirim için gerekli anahtar sözcüktür.
yapı_ismi :      Yapıyı anlatan isimlendirme kurallarına uygun herhangi bir isim olabilir. / yapı                                         etiketidir.
yapı_elemanı : Yapıyı oluşturan değişken isimleridir; isimlendirme kurallarına uygun herhangi bir isim                           olabilir.

!! Bildirimin küme parantezinden sonra noktalı virgül ile sonlandırıldığına dikkat ediniz.!!

Örneğin, düzlemde bir nokta x ve y bileşenlerinden oluştuğuna göre, bu aynı elemanlar yerine bir yapı biçiminde de bildirebiliriz:

struct NOKTA {
    int x;
    int y;
};
...


Benzer biçimde, tarih bilgileri de hiçbiri int türünden üç ayrı değişken yerine, yapı kullanılarak mantıksal bir bütünlük içinde ifade edilebilir:

struct DATE {
    int day;
    int month;
    int year;
};

Yukarıdaki bildirimde DATE yapının ismi; day, month ve year ise int türünden yapı elemanlarıdır.

Yapı bildirimiyle derleyici yalnızca yapılar hakkında bilgi edinir; bellekte onlar için herhangi bir yer ayrılmaz. Yapı bildirimlerini bir çeşit şablon tanımlaması gibi düşünebilirsiniz. Tıpkı fonksiyon prototiplerinde olduğu gibi yapı bildirimleri de yalnızca derleyiciyi bilgilendirmek amacıyla kullanılmaktadır.

Yapı Değişkenlerinin Tanımlanması

Bellekte yer ayırma işlemi yapı değişkenlerinin tanımlanmasıyla oluşur. Yapı değişkenlerinin tanımlanması aşağıdaki iki biçimde yapılır:

struct <yapı_ismi> <yapı_değişkeninin_ismi>;

veya

struct [yapı_ismi] {
    ...
} [değişken_listesi];

Yağı değişkenlerinin yapı bildiriminde sonra tanımlanması zorunludur. 

Örneğin:

struct NOKTA {
    int x;
    int y;
};
...

struct NOKTA a;

veya

struct NOKTA {
    int x;
    int y;
}a;
...


benzer biçimde DATE yapısı türünden bir d değişkeni:

struct DATE {
    int day;
    int month;
    int year;
};
...
struct DATE d;

veya

struct DATE {
    int day;
    int month;
    int year;
}d;
...

Yapı Değişkenlerine İlk Değerin Verilmesi

Yapı değişkenlerine dizilerde olduğu gibi küme parantezleri içerisinde ilk değer verilir. 

Örneğin:

struct date {
    int day;
    int month;
    int year;
};
...
struct date d = {1,4,1995};


Derleyici ilk değerleri yapı elemanlarına sırasıyla yerleştirir. Yani yukarıdaki örnekte yapı elemanlarının alacağı değerler şöyledir:

d.day => 1
d.month => 4
d.year => 1995


Yapı Üyelerine Erişim

Yapı üyelerine erişmek için iki operatör kullanılır: Yapı üyesi operatörü (.) (aynı
zamanda nokta operatörü olarak da bilinir) ve yapı işaretçisi operatörü ( ->) (aynı zamanda ok
operatörü olarak da adlandırılır). Yapı üyesi operatörü yapının değişken ismiyle yapı üyesine erişir. 

Örneğin:

printf("%d",d.day);

Yapı işaretçisi operatörü -aralarında herhangi bir boşluk olmayan eksi (-) işareti ve büyüktür (>) işaretinden oluşan - yapıda bir işaretçi üzerinden bir yapı üyesine erişir.

struct data *x;
printf("%d", x-> year);

Örnek:

#include <stdio.h>

struct card {
char *face;
char *suit;
};

int main( )
{
struct card aCard;
struct card *cardPtr;

aCard.face = "Ace";
aCard.suit = "Spades";

cardPtr = &aCard;

printf( "%s%s%s\n%s%s%s\n%s%s%s\n", aCard.face," of ", aCard.suit,
cardPtr->face," of ",cardPtr->suit,
(*cardPtr).face," of ",(*cardPtr).suit);
return 0;
}
Ekran Çıktısı:

Ace of Spades
Ace of Spades
Ace of Spades

İç İçe Yapılar

Bir yapının içende başka bir yapı nesnesi tanımlanabilir. İç içe yapıların tanımlanması C'de iki biçimde yapılmaktadır:

1) İçerideki yapının bildirimini daha yukarıda yaparak. Bu durumda derleyici doğal akış yönünde ilerlerken bildirilen yapıyı tanıyabilir.

struct date{
    int day, month, year;
};
...
struct person {
    char name[30];
    struct date bday;
};

2) İçerideli yapının dışındaki yapının içerisinde bildirilmesiyle. Bu durumda değişken tanımlanması da yapılmalıdır:

struct person {
    char name[30];
    struct date{
        int day, month, year;
    }bday;
};

Yapıların Fonksiyonlara Parametre Olarak Geçirilmesi

C'de parametrelerin kopyalanarak fonksiyonlara geçirildiğini hatırlayalım. Yapı değişkenleri de fonksiyonlara kopyalanarak parametre olarak geçirilebilirler. 

Örnek:

#include <stdio.h>

struct date{
int day,month,year;
};

void dispDate(struct date x){
printf("Year: %d\n",x.year);
printf("Month: %d\n",x.month);
printf("Dat: %d\n",x.day);
}

int main() {
// Write C code here
struct date n;

n.day = 4;
n.month = 5;
n.year = 1995;
dispDate(n);

}
Ekran Çıktısı:

Year: 1995
Month: 5
Dat: 4




C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz: