C Öğreticisi 15 (Yapılar(Structures)
Last updated
Was this helpful?
Last updated
Was this helpful?
Bu yazılar 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 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 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
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
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ı, 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.