C Öğreticisi 15 (Yapılar(Structures)

Bu yazılar www.tutorialspoint.com/cprogramming/ adresindeki yazı dizilerinin çevirileridir.

Diziler birçok aynı tipte veri değişkenlerini bir arada tutmaya yarar. Benzer bir şekilde, yapı(structure) C’de bulunan farklı türde veri öğelerinin birleştirilmesine izin veren kullanıcı tarafından tanımlanan bir veri türüdür(tipi).

Yapılar bir kaydı temsil etmek için kullanılır. Kitaplarınızı kütüphanede takip etmek istediğinizi düşünelim. Her kitapla ilgili aşağıdaki bilgileri izlemek isteyebilirsiniz -

-Başlık

-Yazar

-Konu

-Kitap Kimliği

Yapı Tanımlamak

Yapı tanımlamak için, struct beyanını kullanmalısınız. Struct beyanı birden çok üyesi olan yeni bir veri türü(tipi) tanımlar.

Struct beyanının formatı şöyledir -

struct [struct adı] {

üye tanımlaması;

üye tanımlaması;

üye tanımlaması;

} [bir ya da daha çok struct değişkeni];

Struct adı isteğe bağlıdır ve her üye tanımı int i; float f gibi normal bir değişken tanımıdır. Yapının tanımının sonunda, son noktalı virgülden önce, bir veya daha fazla yapı değişkeni belirtebilirsiniz, isteğe bağlıdır. Kitap yapısını tanımlama yolumuz -

struct Kitaplar {

char baslik[50];

char yazar[50];

char konu[100];

int kitapKimligi;

} kitap;

Yapı Üyelerine Erişim

Yapı üyelerine erişim için üye erişim operatörü (.) kullanılır. Üye erişim operatörü yapı değişkeni adı ile erişmek istediğimiz yapı üyesi arasında bir periyot olarak kullanılır. Yapı türü değişkenlerini tanımlamak için struct anahtar sözcüğünü kullanırsınız. Aşağıdaki örnek bir program bir yapının nasıl kullanılacağını gösterir -

#include <stdio.h>

#include <string.h>

struct Kitaplar {

char baslik[50];

char yazar[50];

char konu[100];

int kitapKimligi;

};

int main( ) {

struct Kitaplar kitap1; /* Kitaplar tipli kitap1 tanımlaması */

struct Kitaplar kitap2; /* Kitaplar tipli kitap2 tanımlaması */

/* kitap2 belirtimi */

strcpy( kitap1.baslik, “C Programming”);

strcpy( kitap1.yazar, “Nuha Ali”);

strcpy( kitap1.konu, “C Programming Tutorial”);

kitap1.kitapKimligi = 6495407;

/* kitap2 belirtimi */

strcpy( kitap2.baslik, “Telecom Billing”);

strcpy( kitap2.yazar, “Zara Ali”);

strcpy( kitap2.konu, “Telecom Billing Tutorial”);

kitap2.kitapKimligi = 6495700;

/* kitap1 bilgilerini yazdırır */

printf( “kitap1 başlığı : %s\n”, kitap1.baslik);

printf( “kitap1 yazarı : %s\n”, kitap1.yazar);

printf( “kitap1 konusu : %s\n”, kitap1.konu);

printf( “kitap1 kitap kimligi : %d\n”, kitap1.kitapKimligi);

/* kitap2 bilgilerini yazdırır */

printf( “kitap2 başlığı : %s\n”, kitap2.baslik);

printf( “kitap2 yazarı : %s\n”, kitap2.yazar);

printf( “kitap2 konusu : %s\n”, kitap2.konu);

printf( “kitap2 kitap kimligi: %d\n”, kitap2.kitapKimligi);

return 0;

}

Kod derlenip çalıştırıldığında, aşağıdaki sonuç çıkar -

kitap1 başlığı : C Programming

kitap1 yazarı : Nuha Ali

kitap1 konusu : C Programming Tutorial

kitap1 kitap kimligi : 6495407

kitap2 başlığı : Telecom Billing

kitap2 yazarı : Zara Ali

kitap2 konusu : Telecom Billing Tutorial

kitap2 kitap kimligi: 6495700

Fonksiyon Argümanları Olarak Yapılar

Bir yapıyı, diğer herhangi bir değişkeni veya işaretçiyi geçirdiğiniz gibi fonksiyon bağımsız değişkeni olarak iletebilirsiniz.

#include <stdio.h>

#include <string.h>

struct Kitaplar {

char baslik[50];

char yazar[50];

char konu[100];

int kitapKimligi;

};

/* fonksiyon tanımalamsı */

void kitapYazdir( struct Kitaplar kitap );

int main( ) {

struct Kitaplar kitap1; /* Kitaplar tipli kitap1 tanımlaması */

struct Kitaplar kitap2; /* Kitaplar tipli kitap2 tanımlaması */

/* kitap1 belirtimi */

strcpy( kitap1.baslik, “C Programming”);

strcpy( kitap1.yazar, “Nuha Ali”);

strcpy( kitap1.konu, “C Programming Tutorial”);

Book1.kitapkimligi = 6495407;

/* kitap2 belirtimi */

strcpy( kitap2.baslik, “Telecom Billing”);

strcpy( kitap2.yazar, “Zara Ali”);

strcpy( kitap2.konu, “Telecom Billing Tutorial”);

kitap2.kitapKimligi = 6495700;

/* kitap1 bilgilerini yazdır */

kitapYazdir( kitap1 );

/* kitap2 bilgilerini yazdır */

kitapYazdir( kitap2 );

return 0;

}

void kitapYazdir( struct Kitaplar kitap ) {

printf( “kitap basligi : %s\n”, kitap.baslik);

printf( “kitap yazari : %s\n”, kitap.yazar);

printf( “kitap konusu : %s\n”, kitap.konu);

printf( “kitap kimligi : %d\n”, kitap.kitapKimligi);

}

Kod derlenip çalıştırıldığında, aşağıdaki sonuç çıkar -

kitap basligi : C Programming

kitap yazari : Nuha Ali

kitap konusu : C Programming Tutorial

kitap kimligi : 6495407

kitap basligi : Telecom Billing

kitap yazari : Zara Ali

kitap konusu : Telecom Billing Tutorial

kitap kimlig: 6495700

İşaretçilerden Yapılara

Yapılara işaretçiler, diğer herhangi bir değişkenin işaretçisini tanımladığınız şekilde tanımlayabilirsiniz -

struct Kitaplar *structIsaretcisi;

Şimdi, bir yapı değişkeninin adresini yukarıda tanımlanan işaretçi değişkeninde saklayabilirsiniz. Bir yapı değişkeninin adresini bulmak için yapının adından önce ‘&’; operatörü -

structIsaretcisi = &kitap1;

Bir yapının üyelerine o yapıya ait bir işaretçi kullanarak erişmek için, → işlecini aşağıdaki gibi kullanmalısınız -

structIsaretcisi->baslik;

Yapı işaretçisiyle örneği yeniden yazalım.

#include <stdio.h>

#include <string.h>

struct Kitaplar {

char baslik[50];

char yazar[50];

char konu[100];

int kitapKimligi;

};

/* fonksiyon tanımlaması */

void kitapYazdir( struct Kitaplar kitap );

int main( ) {

struct Kitaplar kitap1; /* Kitaplar tipli kitap1 tanımlaması */

struct Kitaplar kitap2; /* Kitaplar tipli kitap2 tanımlaması */

/* kitap1 belirtimi */

strcpy( kitap1.baslik, “C Programming”);

strcpy( kitap1.yazar, “Nuha Ali”);

strcpy( kitap1.konu, “C Programming Tutorial”);

Book1.kitapkimligi = 6495407;

/* kitap2 belirtimi */

strcpy( kitap2.baslik, “Telecom Billing”);

strcpy( kitap2.yazar, “Zara Ali”);

strcpy( kitap2.konu, “Telecom Billing Tutorial”);

kitap2.kitapKimligi = 6495700;

/* kitap1 bilgilerini yazdır */

kitapYazdir( kitap1 );

/* kitap2 bilgilerini yazdır */

kitapYazdir( kitap2 );

return 0;

}

void kitapYazdir( struct Kitaplar kitap ) {

printf( “kitap basligi : %s\n”, kitap->baslik);

printf( “kitap yazari : %s\n”, kitap->yazar);

printf( “kitap konusu : %s\n”, kitap->konu);

printf( “kitap kimligi : %d\n”, kitap->kitapKimligi);

}

Kod derlenip çalıştırıldığında, aşağıdaki sonuç çıkar -

kitap basligi : C Programming

kitap yazari : Nuha Ali

kitap konusu : C Programming Tutorial

kitap kimligi : 6495407

kitap basligi : Telecom Billing

kitap yazari : Zara Ali

kitap konusu : Telecom Billing Tutorial

kitap kimligi: 6495700

Bit Alanları

Bit Alanları, bir yapıdaki verilerin paketlenmesine izin verir. Bu, özellikle bellek veya veri depolama çok çok fazla olduğunda faydalıdır. Tipik örnekler -

Birkaç nesneyi bir makine kelimesine paketleme. Örneğin. 1 bitlik bayraklar sıkıştırılabilir. Harici dosya biçimlerini okuma — standart olmayan dosya biçimleri, örneğin 9 bit tamsayılar olarak okunabilir.

C bunu değişkenin arkasına bit uzunluğunu koyarak yapı tanımında yapabilmemizi sağlar. Örneğin -

struct paketlenmisYapi {

unsigned int f1:1;

unsigned int f2:1;

unsigned int f3:1;

unsigned int f4:1;

unsigned int type:4;

unsigned int my_int:9;

} paket;

paketlenmisYapi burada 6 üye içerir: Dört adet 1 bitlik bayraklar f1..f3, 4 bitlik tip ve 9 bitlik my_int.

C, alanın maksimum uzunluğunun bilgisayarın tamsayı kelime uzunluğundan küçük veya ona eşit olması şartıyla, yukarıdaki bit alanlarını mümkün olduğunca kompakt bir şekilde paketler.

Aksi takdirde, bazı derleyiciler alanlar için bellek çakışmasına izin verirken, diğerleri bir sonraki kelimeyi bir sonraki kelimede saklar.

https://www.tutorialspoint.com/cprogramming/c_structures.htm

Last updated

Was this helpful?