-
Sadrazamv4
ig:sadrazam_v4 tg: Sadrazam.spy
🚀 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! 💻✨
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