🚀 BAŞTAN SONA C DİLİ BÖLÜM-9: Yapılar (`struct`), `typedef` ve Birlikler (`union`) 🏗️

Konu Özeti

C dilinde struct yapıları, farklı veri türlerini tek bir çatı altında toplamak için kullanılır. typedef ile struct tanımlarına kısa takma adlar verilerek kod karmaşası azaltılır. Struct dizileri, birden fazla nesneyi tablo benzeri yapılarda saklamayı sağlar. Pointer ile struct erişiminde ok operatörü (->) kullanılır. union yapısı ise tüm alanların aynı bellek bölgesini paylaştığı, bellek optimizasyonu sunan bir veri türüdür.

🚀 BAŞTAN SONA C DİLİ BÖLÜM-9: Yapılar (`struct`), `typedef` ve Birlikler (`union`) 🏗️

Selamlar! Serimizin 9. bölümüne hoş geldiniz.

Önceki bölümde C dilinde esnekliğin zirvesi olan Dinamik Bellek Yönetimini (`malloc`, `calloc`, `realloc`, `free`) ve Heap bellek mimarisini detaylarıyla öğrenmiştik. Bu bölümde ise farklı türdeki verileri (örneğin bir öğrencinin adı, numarası, ortalaması) tek bir çatı altında toplamamızı sağlayan **Yapıları (`struct`)**, **`typedef`** anahtar kelimesini, Struct dizilerini ve bellek optimizasyonu sunan **`union` (Birlik)** yapısını işleyeceğiz.

---

📌 1. `struct` (Yapı) Nedir ve Neden İhtiyaç Duyulur? 🧱

Diziler (Arrays) yalnızca **aynı türdeki** verileri gruplamamıza izin verir. Ancak gerçek dünyadaki nesneler karmaşıktır:
• Bir *Kitap*: Adı (`char[]`), Sayfa Sayısı (`int`), Fiyatı (`float`)
• Bir *Öğrenci*: İsim (`char[]`), Numara (`int`), Ortalaması (`double`)

`struct`, birbiriyle ilişkili farklı veri tiplerindeki değişkenleri tek bir özel veri tipi altında birleştirmemizi sağlar. (OOP dillerindeki Class yapısının en yalın halidir!)

---

🛠️ 2. `struct` Tanımlama ve Kullanımı ⚙️

### A. Temel Struct Yapısı:

#include <stdio.h>
#include <string.h>

// Struct Tanımı
struct Ogrenci {
char isim[50];
int numara;
float ortalama;
};

int main() {
// Struct Değişkeni Oluşturma
struct Ogrenci ogr1;

// Elemanlara Nokta (.) Operatörü İle Erişim
strcpy(ogr1.isim, "Ahmet Yılmaz");
ogr1.numara = 101;
ogr1.ortalama = 3.45;

printf("--- OGRENCI BILGILERI ---\n");
printf("Isim : %s\n", ogr1.isim);
printf("Numara : %d\n", ogr1.numara);
printf("Ortalama : %.2f\n", ogr1.ortalama);

return 0;
}

---

🏷️ 3. `typedef` Kullanımı: Kod Karmaşasını Azaltma 🏷️

Her seferinde `struct Ogrenci` yazmak yerine `typedef` kullanarak bu yapıya kısa ve özel bir takma isim (alias) verebiliriz.

#include <stdio.h>

// typedef ile yeni bir veri tipi ismi tanımlıyoruz: Ogrenci
typedef struct {
char marka[30];
int modelYili;
double fiyat;
} Araba;

int main() {
// Artık başa 'struct' yazmaya gerek yok! Doğrudan 'Araba' tipi kullanılıyor
Araba a1 = {"Toyota", 2022, 850000.0};

printf("Marka: %s | Yil: %d | Fiyat: %.2f TL\n", a1.marka, a1.modelYili, a1.fiyat);

return 0;
}

---

📦 4. Struct Dizileri (Array of Structs) 📚

Birden fazla struct nesnesini bir dizi altında toplayarak veritabanı benzeri tablolar oluşturabiliriz.

#include <stdio.h>

typedef struct {
int id;
char ad[30];
float maas;
} Personel;

int main() {
// 3 elemanlı Personel *****
Personel liste[3] = {
{101, "Ali", 45000.0},
{102, "Ayşe", 52000.0},
{103, "Mehmet", 48000.0}
};

printf("--- SIRKET PERSONEL LISTESI ---\n");
for (int i = 0; i < 3; i++) {
printf("ID: %d | Ad: %-8s | Maas: %.2f TL\n", liste.id, liste.ad, liste.maas);
}

return 0;
}

---

📍 5. Pointer İle Struct Kullanımı ve Ok Operatörü (`->`) 🎯

Bir struct yapısına pointer aracılığıyla erişiyorsak, nokta (`.`) yerine **Ok Operatörü (`->`)** kullanılır.

`ptr->alan` erişimi, `(*ptr).alan` ifadesinin kısa ve okunaklı halidir.

#include <stdio.h>

typedef struct {
int x;
int y;
} Nokta;

void noktayiOtele(Nokta *n, int dx, int dy) {
// Pointer üzerinden adresdeki değerleri değiştiriyoruz
n->x += dx;
n->y += dy;
}

int main() {
Nokta p1 = {10, 20};

printf("Orijinal Nokta: (%d, %d)\n", p1.x, p1.y);

// Noktanın adresini (&) geçiriyoruz
noktayiOtele(&p1, 5, -3);

printf("Otelendikten Sonra: (%d, %d)\n", p1.x, p1.y); // (15, 17)

return 0;
}

---

🔀 6. Bellek Optimizasyonu: `union` (Birlik) ⚖️

`union` sözdizimi olarak `struct` yapısına birebir benzer. Ancak aralarında kritik bir bellek farkı vardır:

• **`struct`:** İçindeki tüm alanlar için ayrı ayrı bellek ayırır. Toplam boyut tüm alanların toplamıdır (padding hariç).
• **`union`:** Tüm alanlar **AYNI BELLEK BÖLGESİNİ PAYLAŞIR!** Birlik boyutu, en büyük alanın boyutu kadardır. Aynı anda sadece TEK BİR ALAN geçerli veri tutabilir.

#include <stdio.h>

union Veri {
int i;
float f;
char str[20];
};

int main() {
union Veri v;

printf("Union Kapladigi Alan: %lu Byte\n", sizeof(v)); // En büyük alan olan str[20] kadar (20 Byte)

v.i = 10;
printf("v.i atandi -> v.i: %d\n", v.i);

v.f = 220.5; // f ataninca i'nin uzerine yazildi!
printf("v.f atandi -> v.f: %.1f\n", v.f);
printf("v.i bozuldu! -> v.i: %d\n", v.i); // Garbage / Bozulan değer yazar

return 0;
}

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde `struct` yapısını, `typedef` ile takma isim tanımlamayı, Struct dizilerini, pointer üzerinden Ok (`->`) operatörünü ve bellek tasarrufu sağlayan `union` kavramını öğrendik.

👉 **Bölüm 10'da Bizi Ne Bekliyor?**
• Dosya İşlemleri (File I/O) ve Disk Yönetimi 📁
• Dosya Açma Modları (`"r"`, `"w"`, `"a"`, `"rb"`, `"wb"`)
• Karakter ve Metin Okuma/Yazma (`fgetc`, `fputc`, `fgets`, `fputs`)
• Biçimlendirilmiş Do
sya İşlemleri (`fprintf`, `fscanf`)
• İkili (Binary) Dosya İşlemleri (`fread`, `fwrite`)

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! 💻✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
136,702Threads
3,307,629Messages
328,547Members
flankyLatest member
Top Bottom