C Programlama Dilinde Yapılar (struct)

  • 03-01-2020 11:42
  • 15378

Programlama dillerinde veri yapıları önemli bir yer tutar. İşlenecek verilerin hangi yapıda ve bellekte ne şekilde hangi sırayla tutulacağını programı yazarken biz belirleriz. Bu işlem doğru şekilde yapıldığında program yazma işlemi kolaylaşır ve program kodları da daha anlaşılır olur.

Bazı programlarda bir öğeye ait bir kaç farklı özellik için farklı tiplerde değişkenler kullanmamız gerekir. Örneğin 2 boyutlu düzlemdeki bir noktanın konumu için x ve y koordinatları için iki ayrı değişkene ihtiyaç duyarız. Ya da bir öğrencinin bilgilerini bellekte tutmak istersek öğrencinin adı, doğum tarihi, sınıfı gibi bilgilerin tutulması için değişik tiplerde değişkenler kullanmamız gerekir. Bu tip durumlar için C'de kullanılan yapı 'struct' dır. Struct içerisinde istenilen tipte değişken tanımlanabilir. Bunu içindeki verileri bir arada tutan bir veri paketi olarak düşünebilirsiniz.

Aşağıdaki örnekte struct tanımı ve struct elemanlarına erişimin nasıl yapıldığını görebilirsiniz.

#include <stdio.h>

//Struct tanımı
struct POINT{
    int x;
    int y;
};

int main()
{
    struct POINT p; //Point tipinde bir struct oluşturuluyor.
    //p'nin içeriğinde bulunan x ve y değişkenlerine değerler veriliyor.
    p.x=234;
    p.y=987;
    //p'nin içeriği ekrana yazdırılıyor.
    printf("x=%d\ny=%d",p.x,p.y);
    return 0;
}

 

Struct içerisindeki değişkenlere erişmek için struct adından sonra nokta konur ve değişken ismi yazılır. Bu kullanım atamalar ve karşılaştırmalarda bir değişkenin kullanılabileceği her yerde kullanılır.

Struct pointer olarak da tanımlanabilir. Bu şekilde tanımlandığında değişkenlere erişim için '->' işareti kullanılır. kullanımını aşağıdaki örnekte inceleyebilirsiniz.

 

#include <stdio.h>
#include <stdlib.h>



//Struct tanımı
struct POINT{
    int x;
    int y;
};


int main()
{
    struct POINT * p; //Point tipinde bir struct oluşturuluyor.
    //Struct için sistemden bellek alınıyor
    p=(struct POINT *)malloc(sizeof(struct POINT));
    if(!p){
        printf("Bellek hatası.");
        return 1;
    }
    //p'nin içeriğinde bulunan x ve y değişkenlerine değerler veriliyor.
    p->x=234;
    p->y=987;
    //p'nin içeriği ekrana yazdırılıyor.
    printf("x=%d\ny=%d",p->x,p->y);

    //Alınan bellek geri veriliyor.
    free(p);
    return 0;
}

 

Typedef Kullanımı

Typedef anahtar kelimesi C'de yeni bir tip oluşturmak için kullanılır. Önce typedef sonra veritipi yazılır daha sonra da tipe verilecek isim yazılır. Bu kullanım programda değişiklik yapılacağı zaman büyük kolaylık sağlar. Tipin tanımlandığı yerden değiştirildiğinde o tipi kullanan bütün yerlerde tip değişmiş olur. Ayrıca struct larda kodların daha sade ve anlaşılır olmasını sağlar.

 int tipinde yeni bir tip tanımı.

typedef int yenitip;

 

struct tipinde yeni bir tip tanımı. Bu tanımla POINT artık yeni bir tip gibi kullanılabilir.

#include <stdio.h>
#include <stdlib.h>



//Struct tanımı
typedef struct{
    int x;
    int y;
}POINT;

int main()
{
    POINT * p; //Point tipinde bir struct oluşturuluyor.
    //Struct için sistemden bellek alınıyor
    p=(POINT *)malloc(sizeof(POINT));
    if(!p){
        printf("Bellek hatası.");
        return 1;
    }
    //p'nin içeriğinde bulunan x ve y değişkenlerine değerler veriliyor.
    p->x=234;
    p->y=987;
    //p'nin içeriği ekrana yazdırılıyor.
    printf("x=%d\ny=%d",p->x,p->y);

    //Alınan bellek geri veriliyor.
    free(p);
    return 0;
}

 

C'de tanımlanan struct yapısı içindeki veriler bellekte tanımlandığı sıra ile tutulur. Büyüklükleri birbirinden farklı iki struct pointer tip dönüşümü ile bir birine atanmaya çalışılırsa atama sonucu struct 2'in 1. elemanı struct 1'in 1. elemanını gösterir. Aslında aktarılan yanlızca struct'a ait bir bellek adresidir değişkenlerin adresi aktarılmaz. struct yapısı bir şablondur, şablon kendi içinde sabittir ama bellek üzerinde hareketlidir. Pointer hangi bellek adresini gösterirse o adresten başlayarak sıra ile değişkenlerin bellekteki konumların da aynı sıra ile olduğu varsayılır. Aşağıdaki örnekte birbirinden farklı iki struct birbirine atanıyor. Değişkenlerin aynı sıra ile tanımlandığına dikkat edin. Değişkenlerin tanımlanma sırası değiştirerek denerseniz içeriklerinde değiştiğini göreceksiniz.

 

#include <stdio.h>
#include <stdlib.h>



//Struct tanımı
typedef struct{
    int x;
    int y;
}POINT2D;

typedef struct{
    int x;
    int y;
    int z;
}POINT3D;

int main()
{
    POINT2D *p2; //POINT2D tipinde bir struct oluşturuluyor.
    POINT3D *p3; //POINT3D tipinde bir struct oluşturuluyor.

    p3=(POINT3D *)malloc(sizeof(POINT3D));
    if(!p3){
        printf("Bellek hatası.");
        return 1;
    }
    //p'nin içeriğinde bulunan x ve y değişkenlerine değerler veriliyor.
    p3->x=234;
    p3->y=987;
    p3->z=100;
    //p2'ye p3 atanıyor ve p3 ile p2 aynı belleği kullanıyor.
    p2=(POINT2D *)p3;
    //p'nin içeriği ekrana yazdırılıyor.
    printf("x=%d\ny=%d",p2->x,p2->y);

    //Alınan bellek geri veriliyor.

    return 0;
}