Mozilla Türkiye Gönüllü Topluluğu Blog

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


Bu yazılar https://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 
#include 
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.

	
double maaş = dizi[9];
	

Bu kod bizi dizinin 10.elemanına götürür, Aşağıdaki kod, bildirim, atama ve dizilere erişme’yi gösterir -

	
#include 
#include 
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);
}
	

Yukarıdaki kod derlenip çalıştırıldığında, takip eden sonuç ortaya çı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
	

İş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 
#include 
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

Bir sonraki yazıya buradan ulaşabilirsiniz.