You are on page 1of 26

I

HER YÖNÜYLE

C
Tevfik Kızılören

KODLAB
II
®
KODLAB 95
HER YÖNÜYLE C

TEVFİK KIZILÖREN

ISBN 978-605-5201-09-8
Yayıncılık Sertifika No: 13206

14. Baskı: 2024

Genel Yayın Yönetmeni


Hüseyin Üstünel

Grafik Tasarım
Kodlab Grafik

Satış ve Pazarlama
Can Üstünel

Baskı: Ezgi Matbaacılık Ltd. Şti.     Sertifika No: 45029

Bu kitabın bütün yayın hakları Kodlab Yayın Dağıtım Yazılım ve Eğitim Hizmetleri
San. ve Tic. Ltd. Şti.’ne aittir. Yayınevimizin yazılı izni olmaksızın kısmen veya
tamamen alıntı yapılamaz, kopya çekilemez, çoğaltılamaz ve yayınlanamaz.

KODLAB Yayın Dağıtım Yazılım ve Eğitim Hizmetleri San. ve Tic. Ltd. Şti.
15 Temmuz Mh. 1481. Sk. No : 44/A Bağcılar / İSTANBUL

tel: 0(212) 514 55 66 web: www.kodlab.com


0(212) 514 66 61 e-posta: bilgi@kodlab.com
III

TEVFİK KIZILÖREN
1982 yılında Konya’da doğdu. Lisans ve Yüksek Lisans eğitimini Anadolu Üniversitesi
Elektrik-Elektronik Mühendisliği bölümünde tamamladı. Şu anda bir kamu kuruluşunda
yazılım uzmanı olarak görev yapmaktadır. Çalıştığı kurum için Java tabanlı irili ufaklı çok
sayıda uygulama geliştiren yazar, çeşitli bilimsel araştırma projeleri için danışmanlık
yapmaktadır. Halen Elektrik-Elektronik Mühendisliği konusunda Doktora eğitimine
devam etmekte olan yazarın Java teknolojileri dışındaki ilgi alanları arasında Paralel
Programlama, Ağ Güvenliği, Yapay Sinir Ağları, Görüntü İşleme ve Gömülü Programlama
bulunmaktadır. Yazarımızın KODLAB’tan daha önce Java ve Java Teknolojileri,
Objective-C, Swift ve Objective-C ile iOS SDK kitapları çıkmıştır.
IV
V

ÖN SÖZ
Çoğu mühendislik öğrencisi gibi ben de programlamaya C dili ile başladım. Başlangıç
olarak bu dili öğrenmek bana pek çok avantaj sağladı. En önemli avantajlarından bir
tanesi, diğer programlama dillerine geçişte çok büyük kolaylık sağlamasıydı. Aynı söz
dizimini kullanmaları sebebiyle, C programlama dilini hakkıyla bilen birisinin C’den
türemiş programlama dillerini öğrenme süresi çok daha kısa olmaktadır. Bu sebeple
temeli C programlama dili olan öğrenciler, diğer programlama dilleriyle başlayan
öğrencilere göre daha avantajlıdır.

C programlama dili getirdiği çeşitli alt seviye özellikler sebebiyle, öğrenmesi görece zor
bir programlama dilidir. Bu kadar yaygın olmasının sebebiyse; öğrenilmesini zorlaştıran
alt seviye özelliklerinin dile benzersiz bir güç katmasıdır. C programlama dili, hafıza
erişimin esnekliği, yaygın kütüphaneleri ve kullanıcı kitlesi sayesinde; halen günümüzün
en popüler programlama dilleri arasındadır.

C programlama dili özellikle hafıza yönetiminin esnekliği sebebiyle;

• küçük cihazlarda çalışan mikroişlemcilerin programlanmasında,


• performans isteyen simülasyon, oyun gibi yazılımların, geliştirilmesinde,
• ve sistem programcılığında,

… halen birkaç alternatif dilden biridir. Bu sebeple önümüzdeki yıllarda da varlığını


sürdürmeye devam edecektir. Bu kitabın amacı da C programlama dilini güncel
geliştirme ortamları üzerinde anlatan yeni ve uygulamaya dayalı bir kaynak sunmaktır.
Bu anlamda kitabın tüm okurlarımıza faydalı olmasını temenni ediyorum.
Tevfik Kızılören
VI
VII

KİTAP HAKKINDA
C programlama dili getirdiği çeşitli alt seviye özellikler sebebiyle, öğrenmesi görece zor
bir programlama dilidir. Bu kadar yaygın olmasının sebebiyse; öğrenilmesini zorlaştıran
alt seviye özelliklerinin dile benzersiz bir güç katmasıdır. C programlama dili, hafıza
erişimin esnekliği, yaygın kütüphaneleri ve kullanıcı kitlesi sayesinde halen günümüzün
en popüler programlama dilleri arasındadır.

Bu kitapta C programlama dilinin tüm özellikleri olabildiğince detaylı ve bol örnekli bir
şekilde okuyucuya sunulmuştur. Anlatılan her bir konu ardından o konuyu anlatan 144
adet örnek eklenmiştir. Örnekler olabildiğince kısa tutulmaya çalışılmış ve örnekleri
açıklarken konunun üzerinden tekrar geçilerek konunun pekiştirilmesi amaçlanmıştır.
Kitabın içeriği tüm üniversiteler için C ile Programlamaya Giriş ve benzeri derslerin
müfredatının tamamını karşılamaya uygun olarak tasarlanmıştır.

Bölümlerin sonunda her seviyede okurun beklentisini karşılayacak şekilde kolaydan


zora doğru 257 adet bölüm sonu sorusu eklenmiştir. Kitapla birlikte verilen
Kodlab.tv platformunda, bölümlerdeki örnekler üzerinden gidilerek oluşturulmuş konu
anlatımlarını ve bölüm sonu sorularından bazılarının çözümlerini bulacaksınız.

Konu anlatımlarına ek olarak geliştirme ortamlarının kurulumu, kullanımı ve C


programlarının komut satırından derlenmesi ve çalıştırılması konularını içeren video
anlatımlar da eklenmiştir.
Tevfik Kızılören
VIII

Her konuda desteklerini esirgemeyen,


eşime ve iş arkadaşlarıma ithafen....
İÇİNDEKİLER IX

İÇİNDEKİLER

1 GİRİŞ 1
Bu Kitap Kimler İçin? 1
Programlama Dili Kavramı 2
Programlama Dilinin Tarihçesi 2
Programlama Dillerinin Türleri 4
Makina Dili 4
Assembly Dili 4
Scrıpt Dilleri 5
Yüksek Seviye Programlama Dilleri 5
C Programlama Dilinin Tarihçesi 6
C Programlama Dili Neden Bu Kadar Yaygın? 8

2 ISINMA TURLARI DERLEYİCİ VE DERLEME KAVRAMLARIYLA


BİRLİKTE GCC DERLEYİCİSİNE BİR BAKIŞ 11
Giriş 11
İlk C Programımız-merhaba.c 11
Kaynak Dosya ve Kütüphane Kavramları 13
Kaynak Dosya (Source Code) 13
Kütüphane Kavramı 13
Standart Kütüphaneler 14
C Programlarının Komut Satırı Aracılığıyla Derlenmesi ve Çalıştırılması 14
GCC (GNU Compiler Collection) 14
gcc Derleyicisinin Kurulumu 15
Linux İşletim Sistemi Üzerinde 15
gcc Derleyicisinin Kurulumu 15
macOS İşletim Sistemi Üzerinde 16
gcc Derleyicisinin Kurulumu 16
X HER YÖNÜYLE C

Windows İşletim Sistemi Üzerinde 17


gcc Derleyicisinin Kurulumu 17
MinGW Kurulum Adımları 18
Kaynak Koddan Programın Yürütülmesine Kadar Bir C Derleyicisinin Yaptığı İşler 21
Yazdığımız C Programlarının gcc Derleyicisi Aracılığıyla Derlenmesi 23
Adım 1: Ön İşleme (Preprocess) 26
Adım 2: Derleme (Compıle) 27
Adım 3: Çevirme (Assemble) 30
Adım 4: Bağlama (Link) 31
Derleme İşlemi Sonrası Oluşan Çalıştırılabilir Dosyaların Komut Satırı 33
Bir C Derleyicisinin Yaptığı Diğer İşler 34
Bundan Sonrası 34

3 VISUAL STUDIO CODE(VSCODE) ORTAMI VE BİR C PROGRAMININ


ADIM ADIM YÜRÜTÜLMESİ 35
Giriş 35
Visual Studio Code Geliştirme Ortamının Kurulumu 37
VSCode C/C++ Eklentisinin Kurulması 39
VSCode ile C Projesi Oluşturmak 41
Bir C Programının Yapısı 46
1. Ön İşlemci Direktifleri 47
2. Fonksiyon ya da Fonksiyon Prototipi Deklarasyonları 48
3. main Fonksiyonu 48
Bir C Programının Adım Adım İncelenerek Yürütülmesi 49
Bundan Sonrası 58

4 DEĞİŞKENLER 59
Giriş 59
Değişken Kavramı 60
Değişkenlerin Tanımlanması 60
İÇİNDEKİLER XI

Değişkenlerin Deklarasyonu (Declaration) 61


Değişkenlere Değer Atanması (Initialization) 62
Tanımlama Esnasında Değer Atama 62
Tek Bir Satırda Tanımlanan Birden Fazla
Değişkenden, Bazılarına Değer Atanması 62
Tüm Değişkenlere Aynı Değeri Atamak 63
Tanımlama Sonrasında Değer Atama 64
Değişkenlerin İsimlendirilmesi (Naming) 65
Anahtar Kelimeler (Keywords) 65
Değişkenlerin İsimlendirilme Kuralları 65
Yazılı Olmayan Kurallar 67
Bundan Sonrası 70
Bölüm Sonu Soruları 70

5 TEMEL VERİ TİPLERİ (TYPES) 71


Giriş 71
Temel Veri Tipleri 72
Temel Veri Tiplerinin Türevleri 80
Sayısal Veri Tiplerinin Bellekte Kapladığı Alanları Yazdıran Uygulama 82
Tam sayı ve Türevi Veri Tiplerinin Maksimum - Minimum Değerlerini 84
Yazdıran Uygulama 84
Ondalık Sayı Veri Tiplerinin Maksimum ve Minimum Değerleri 86
(Precision) Yazdıran Uygulama 86
Özel Değişken Tipleri 87
Tip Niteleyicileri (Type Qualifiers) 88
const Anahtar Kelimesi ve Sabit Değişkenler 88
volatıle anahtar Kelimesi 89
restrıct Anahtar Kelimesi 90
_Atomic anahtar Kelimesi 93
Bellek Depolama Sınıfları (Storage Classes) 93
XII HER YÖNÜYLE C

extern Anahtar Kelimesi 93


register Anahtar Kelimesi 94
static Anahtar Kelimesi ve Statik Değişkenler 96
auto Anahtar Kelimesi 98
Tip Dönüşümleri (Type Casting) 98
Dönüşüm (cast) Operatörü 99
Tip Çevrimleri (Type Conversion) 102
Diğer Tip Çevrim Fonksiyonları 105
Bundan Sonrası 108
Bölüm Sonu Soruları 108

6 OPERATÖRLER 109
Atama Operatörü (=) 110
Aritmetik Operatörler (+, -, *, /, %) 110
Toplama Operatörü (+) 110
Çıkarma Operatörü (-) 111
Negatifleme Operatörü (-) 111
Çarpma Operatörü (*) 112
Bölme Operatörü (/) 112
Mod Operatörü (%) 113
Aritmetik Artırma ve 113
Eksiltme Operatörleri (++, --) 113
Aritmetik Artırma Operatörü (++) 114
Aritmetik Eksiltme Operatörü (--) 114
Artırma ve Eksiltme Operatörlerinin 115
Değişkenin Önünde ve Arkasında 115
Yer Almasının Farkları 115
Aritmetik Atama Operatörleri (+=, -=, *=, /=, %=) 116
Topla ve Ata Operatörü (+=) 116
İÇİNDEKİLER XIII

Çıkar ve Ata Operatörü ( -= ) 117


Çarp ve Ata Operatörü (*=) 118
Böl ve Ata Operatörü (/=) 118
Böl ve Kalanı Ata Operatörü (%=) 119
İlişkisel Operatörler (<, >, <=, >=, ==, !=) 120
Küçüktür Operatörü (<) 120
Büyüktür Operatörü (>) 120
Küçük Eşittir Operatörü (<=) 120
Büyük Eşittir Operatörü (>=) 120
Eşit mi Operatörü (==) 120
Farklı mı Operatörü (!=) 120
Mantıksal Operatörler 123
Not (Değil) Operatörü (!) 123
And (ve) Operatörü (&&) 123
Or (Veya) Operatörü (||) 123
Xor Operatörü (^) 123
Bitwise (Bitler Üzerinde İşlem Yapan) Operatörler 125
Mantıksal And (ve) Operatörü (&) 125
Mantıksal Or (veya) Operatörü (|) 125
Mantıksal Xor (Farklı) Operatörü (^) 126
Complement (Tümleme) Operatörü (~) 127
Bit Tabanlı Sağa Sola Kaydırma Operatörleri (<<, >>) 128
? : Operatörü 129
Operatör Önceliği 130
İşaretçi Operatörleri (& ve *) 133
Tip Dönüşümü (Type Casting) Operatöreri 133
Görünür Dönüşüm (Explicit Casting) 133
Görünmez Dönüşüm (Implicit Casting) 134
sizeof Operatörü 134
XIV HER YÖNÜYLE C

Bundan Sonrası 135


Bölüm Sonu Soruları 135

7 TEMEL GİRDİ ÇIKTI FONKSİYONLARI 139


Giriş 139
Giriş/Çıkış (I/O) Fonksiyonları 139
printf Fonksiyonu 141
Biçim Niteleyicilerinin Genel Yapısı 146
% İşareti 146
Niteleyici (Specifier) 146
Karakter Değişkenlerin Yazdırılması 147
Tam sayı Değişkenlerin Yazdırılması 148
Ondalık Sayı Değişkenlerin Yazdırılması 150
Karakter Dizilerinin Yazdırılması 153
İşaretçi Değişkenlerin Yazdırılması 153
Uzunluk Belirteci (Length Modifier) 154
Kesinlik Belirteci (Precision) 155
Genişlik Belirteci (Width) 156
Bayraklar (Flags) 158
Özel Karakterler (Escape Sequences) 160
scanf Fonksiyonu 162
Klavye Ara Belleği (Keyboard Buffer) Kavramı 165
stdıo.h Kütüphanesinde Bulunan Diğer I/O Fonksiyonları 166
getchar ve putchar Fonksiyonları 166
getch Fonksiyonu 167
getche Fonksiyonu 168
gets ve puts Fonksiyonları 169
sprintf ve sscanf Fonksiyonları 169
fprintf ve fscanf Fonksiyonları 169
fgets ve fputs Fonksiyonları 169
İÇİNDEKİLER XV

Bundan Sonrası 169


Bölum Sonu Soruları 170

8 ALGORİTMA KAVRAMI, AKIŞ ŞEMALARI,


YALANCI KOD KAVRAMI VE PROGRAM DENETİM DEYİMLERİ 173
Giriş 173
Problem Çözme Mantığı 174
Algoritma Kavramı 174
Akış Şeması (Flowchart) 176
Yalancı Kod (Pseudocode) 179
Koşul (Şart) İfadeleri 181
ıf İfadesi ve Yapısı 181
if Cümleciğinin İncelendiği Bir Program: 186
HesapIslemleri 186
C Programlama Dilinde Rasgele (Random) 187
Sayı Üretimi Hakkında Bilgi 187
if-else Yapısı 191
if-else Yapısının İncelenmesi: HesapIslemleriV2 194
if Cümleciği İçerisinde Karmaşık Mantıksal İfadeler Kullanmak 195
İç İçe if-else Yapıları 197
else if Deyimi 199
switch-case Deyimi 202
default Anahtar Kelimesi 204
break Anahtar Kelimesi 206
? : Operatörü 208
Bundan Sonrası 208
Bölüm Sonu Soruları 208
XVI HER YÖNÜYLE C

9 DÖNGÜLER 211
Giriş 211
Döngüler 214
while Döngüsü 214
Sonsuz Döngü (Infınıte Loop) 217
do-while Döngüsü 217
for Döngüsü 221
İç İçe Döngüler 225
break ve continue Deyimleri 228
break 228
continue 229
Bundan Sonrası 230
Bölüm Sonu Soruları 230

10 DİZİLER (ARRAYS) 235


Giriş 235
Tek Boyutlu Diziler 236
Dizi Elemanlarına Döngü Yardımıyla Erişim 244
Bilgi: Dizi Elemanlarını Kullanıcıdan Okumak 246
Çok Boyutlu Diziler 249
İki Boyutlu Diziler 252
Diziler Üzerinde Sıklıkla Yapılan İşlemler 256
Dizilerde Arama 256
Sıralı Arama (Sequential Search) 256
İkili Arama (Binary Search) 259
Dizilerde Sıralama 265
Bilgi: Yer Değiştirme (Swap) İşlemi 266
Bundan Sonrası 269
Bölüm Sonu Soruları 270
İÇİNDEKİLER XVII

11 FONKSİYONLAR VE PROGRAM YAPISI 275


Giriş 275
Fonksiyon Kavramı 276
Fonksiyon Prototipi (İmzası) 280
Hiçbir Dönüş Tipi Olmayan (void) Fonksiyonlar 282
Yapısal Programlama Kavramı 285
İç İçe Fonksiyonlar 286
main Fonksiyonu ve C Programlarına Çalıştırma Esnasında Parametre Aktarmak 291
Bir Fonksiyona Parametre Olarak Dizi Göndermek 293
Bir Fonksiyona Parametre Olarak Çok Boyutlu Dizi Göndermek 296
Özyineleme (Recursion) 299
Özyinelemeli Fonksiyonlar (Recursıve Functions) 300
Kod Blokları ve Değişken Kapsamları (Scope) 303
Kapsamlarına Göre Değişken Türleri 307
Yerel Değişkenler 307
Global Değişkenler 308
Bundan Sonrası 310
Bölüm Sonu Soruları 311

12 KARAKTER DİZİLERİ (STRINGS) 317


Giriş 317
Karakter Dizileri (Strings) 317
puts() ve gets() Fonksiyonları 321
Karakter Dizilerinden Oluşan Diziler (String Arrays) 322
Karakter Dizileri Üzerinde İşlem Yapan Standart Kütüphane Fonksiyonları 325
strlen() fonksiyonu 325
strcpy() fonksiyonu 327
strcat() fonksiyonu 328
strcmp() Fonksiyonu 330
String.h Kütüphanesindeki Diğer Fonksiyonlar 336
XVIII HER YÖNÜYLE C

Karakter Dizileri Üzerinde Değişiklik (Manipulation) Yapan Fonksiyonlar 336


strncpy Fonksiyonu 336
strncat Fonksiyonu 337
Karakter Dizileri Üzerinde Arama (Search) Yapan Fonksiyonlar 337
strncmp Fonksiyonu 337
strcoll Fonksiyonu 339
strchr ve strrchr Fonksiyonları 339
strcspn ve strspn Fonksiyonları 340
strpbrk Fonksyionu 341
strstr Fonksyionu 342
strtok Fonksyionu 342
Hafıza Blokları Üzerinde İşlem Yapan Fonksiyonlar 344
Karakter Dizilerini Kullanırken Sık Yapılan Hatalar 345
Hatalı Kullanım 1: 345
Hatalı Kullanım 2: 346
Sol Değer (lvalue) ve Sağ Değer (rvalue) Kavramları 346
Değerinde Değişiklik Yapılamayan Sol Değerler (Nonmodifiable lvalues) 348
sscanf ve sprintf Fonksiyonları 349
sprintf Fonksiyonu 349
sscanf Fonksiyonu 351
Bundan Sonrası 352
Bölüm Sonu Soruları 352

13 İŞARETÇİLER (POINTERS) 357


Giriş 357
İşaretçi (Pointer) Kavramı 358
İşaretçi Deklerasyonu 360
Aynı Tipe Sahip İşaretçilerin Deklarasyonları 361
İşaretçi Değişkenlerin Kullanımı 362
Adres Operatörü (&) 363
İÇİNDEKİLER XIX

Erişim Operatörü (*) 363


Referanstan Kurtarma Kavramı ve NULL Değerinin İşaretçi Kullanımındaki Önemi 365
Boş İşaretçi (Null Pointer) 365
Kullanılmayan İşaretçilerin NULL Değeriyle Sonlandırılması 366
Erişim ve Adres Operatörlerinin Kullanımları 367
Sağ Değer (rvalue) ve Sol Değer (lvalue) Kavramlarının İşaretçi 370
İşaretçilerin Daha İyi Kavranması İçin Telefon Numarası Analojisi 371
Neden Tek Bir Tip İşaretçi Yok? (İşaretçi Aritmetiği) 377
Dizilerin İşaretçiler Aracılığıyla Yönetimi 380
İşaretçiler Üzerinde Tanımlı Operasyonlar 383
Erişim Operatörünün Artırma (++) ve Eksiltme (--) Birlikte Kullanımı 386
İşaretçilerin Karşılaştırılması 388
Bir işaretçiyi Fonksiyona Parametre Olarak Göndermek 390
Değer Yöntemiyle Çağrı (Call By Value) 390
Referans Yöntemiyle Çağrı (Call By Reference) 391
Yer Değiştirme (Swap) İşleminin İşaretçiler Aracılığıyla Yapılması 392
Ortalama Bulan Programın İşaretçi Notasyonu Kullanan Versiyonu 393
Karakter Dizilerinin İşaretçiler Aracılığıyla Yönetimi 395
Genel Amaçlı (void) İşaretçiler 396
const Anahtar Kelimesinin İşaretçilerle Birlikte Kullanımı 398
Sabit İşaretçiler (Constant Pointers) 398
Sabit Bir Değere İşaret Eden İşaretçiler (Pointers to Constants) 399
Fonksiyon İşaretçileri (Functıon Pointers) 399
Fonksiyon İşaretçilerini Başka Fonksiyonlara Parametre Olarak Göndermek 403
Değişken Sayıda Parametre Alan Fonksiyonlar 406
printf Fonksiyonunun Yaptığı İşin Benzerini Yapan Değişken 412
Bundan Sonrası 415
Bölüm Sonu Soruları 415
XX HER YÖNÜYLE C

14 DİNAMİK BELLEK YÖNETİMİ (DYNAMIC MEMORY MANAGEMENT) 419


Giriş 419
C Programlama Dilinin Kullandığı Bellek Çeşitleri 419
Statik Bellek (Static Memory) 419
Otomatik Bellek (Automatic Memory) 421
Dinamik Bellek (Dynamic Memory) 422
Dinamik Bellek Yönetimi 423
malloc() Fonksiyonu 423
free() Fonksiyonu 424
sizeof() Fonksiyonu 424
İşaretçi Değişkenlerin Birbirine Atanması Durumu 426
Farklı Bellek Alanlarının Farklı İşaretçiler Aracılığıyla Yönetimi 428
Dizilerde Dinamik Bellek Yönetimi 431
Tek Boyutlu Dizilerde Dinamik Bellek Yönetimi 431
İki Boyutlu Dizilerde Dinamik Bellek Yönetimi 434
İşaretçi Değişkenlerin Adreslerini Tutan 435
İşaretçiler (Pointers to Pointers) 435
Diğer Hafıza Yönetimi Fonksiyonları (calloc ve realloc) 442
String.h Kütüphanesindeki Bellek Yönetim Fonksiyonları 446
memset 446
memcpy ve memmove 448
memcpy 448
memmove 448
Örtüşen (overlap) Bellek Alanlarında memcpy 449
ve memmove Fonksiyonlarının Durumu 449
memchr 450
memcmp 451
Bundan Sonrası 452
Bölüm Sonu Soruları 453
İÇİNDEKİLER XXI

15 ÖNİŞLEMCİ DİREKTİFLERİ VE PROGRAM ORGANİZASYONU 459


Giriş 459
Önİşlemci (Preprocessor) 459
Önİşlemci Direktifleri (Preprocessor Directives) 460
#define 461
#define ile Program Sabiti Tanımlamak 461
const ve #define Arasındaki Farklar 462
#define ile Makro Tanımlamak 463
Makro Tanımlarında Parantezlerin Önemi 465
#define Komutunun Diğer Kullanımları 467
#define Direktifinin Aşırı Kullanımının Dezavantajları 469
Şartlı Derleme (Conditional Compıle) Komutları 470
#ifdef #else #endif Komut Grubu 470
#else Olmadan Kullanım 473
#ifndef #else #endif Komut Grubu 473
#if defined() ve #if !defıned() Yapıları 474
#elif İfadesi 475
#undef Direktifi 476
#pragma Direktifi 476
#include Direktifi 477
C Program Organizasyonu 478
Arayüz ve Implementasyon Farkı 480
.h Uzantılı Kütüphane Dosyalarının Yapısı 481
.c Uzantılı Kaynak Dosyalarının Yapısı 482
Birden Fazla Dosyadan Oluşan C Programları 482
static anahtar Kelimesi, Statik Fonksiyonlar ve Encapsulation 486
Birden Fazla Dosyadan Oluşan C Programlarının Derlenmesi 487
Komut Satırı Kullanarak Derleme 487
make Aracı Kullanarak Derleme 488
XXII HER YÖNÜYLE C

Makefile Kavramı 488


make Komutunun Kullanımı 491
#include Direktifinin Kullanımlarında Oluşabilecek Hatalar 493
Include Koruması (Include Guard) Yöntemi 494
faktoriyel.h Dosyasının İçeriği 494
Bundan Sonrası 496
Bölüm Sonu Soruları 496

16 YAPILAR (STRUCTS), ORTAKLIKLAR (UNIONS), BİT ALANLARI


(BITFIELDS) VE NUMARALANDIRMALAR (ENUMERATIONS) 501
Giriş 501
Yapılar (Structs) 501
Yapılara Deklerasyon Sırasında 504
İlk Değer Atanması 504
Yapıların İşaretçiler Aracılığıyla Kullanımı (Struct Pointers) 505
Yapıların Diziler ile Birlikte Kullanılması 507
Yapılar ve Dinamik Bellek Fonksiyonları 509
Yapılar Üzerinde Geçerli Operatörler 511
Yapıların Fonksiyonlara Parametre Olarak Gönderilmesi 513
İç İçe Yapılar (Nested Structs) 514
typedef Anahtar Kelimesi 517
typedef Anahtar Kelimesini, Yapılar 519
Henüz Tanımlanırken Kullanmak 519
Bit Alanları (BitFields) Kavramı 520
BitField Kullanımındaki Kısıtlamalar 523
Numaralandırma (Enumeration) Kavramı 524
Ortaklıklar (Unions) 526
Örnek Çalışma - Film Veri tabanı Uygulaması 528
maın.c Dosyası 529
İÇİNDEKİLER XXIII

film_islemleri.h Dosyası 533


film_islemleri.c Dosyası 535
Bundan Sonrası 541
Bölüm Sonu Soruları 542

17 DOSYA İŞLEMLERİ 549


Giriş 549
Dosya Türleri 550
Metin Dosyaları (Text Files) 550
İkili Dosyalar (Bınary Files) 551
FILE İşaretçisi ve Akışlar 552
Dosyaların Açılması ve Kapanması (fopen ve fclose) 552
fopen Fonksiyonu 552
fclose Fonksiyonu 553
Dosyaların Açılış Modları 554
Metin Dosyası İşlemleri 555
Karakter Bazında İşlem Yapan Dosyalar 556
getc ve fgetc Fonksiyonları 556
EOF İfadesi 559
putc ve fputc Fonksiyonları 561
Biçimlendirilmiş Metin Bazında İşlem Yapan Fonksiyonlar 563
fprintf ve fscanf Fonksiyonları 563
Satır Bazında İşlem Yapan Fonksiyonlar 566
fgets ve fputs Fonksiyonları 566
feof ve rewınd fonksiyonları 569
feof fonksiyonu 569
rewind fonksiyonu 570
İkili Dosya (Binary Fıle) İşlemleri 570
fread ve fwrite Fonksiyonları 570
XXIV HER YÖNÜYLE C

Dosyalara Rasgele Erişim (Random Access) Sağlayan Fonksiyonlar 574


fseek Fonksiyonu 574
ftell Fonksiyonu 576
Standart Akışlar 577
Bundan Sonrası 578
Bölüm Sonu Soruları 579

18 TEMEL VERİ YAPILARI (BASIC DATA STRUCTURES) 583


Giriş 583
Yığın (Stack) Yapısı 584
Yığının Taşması (Stack Overflow) 590
Yığının Çökmesi (Stack Underflow) 590
Yığın Yapısının Gerçek Hayat Kullanımları 590
Bağlantılı Liste (Linked List) Yapısı 591
Bağlantılı Listeyi Oluşturma 592
Bağlantılı Listeye Eleman Ekleme 593
Bağlantılı Listeden Eleman Çıkarma 594
Yığın Yapısının Bağlantılı Liste Versiyonu 598
Kuyruk (Queue) Yapısı 601
Kuyrukların Uygulamaları 605
Öncelik Kuyrukları (Priority Queues) 605
Çift Taraflı Bağlantılı Liste (Double Linked List) Yapısı 605
Çift Bağlantılı Listeye Eleman Ekleme 606
Eleman Çıkarma 607
Bundan Sonrası 613
Bölüm Sonu Soruları 614
İÇİNDEKİLER XXV

19 C DİLİNİN STANDARTLARI VE
C UYGULAMALARININ TAŞINABİLİRLİĞİ 619
Giriş 619
C Programlama Dilinin Standartları 619
Kernıghan & Rıtchıe Standardı - K&R C 620
ANSI C Standardı (C89) 620
ISO C Standardı (C90) 621
C Diline 1995 Yılında Yapılan Ekleme (Normatıve Addendum 1 - NA1) 621
ISO 99 C Standardı (C99) 622
ISO 2011 C Standardı (C11) 622
Kodun Belli Bir Standarda Göre Derlenmesi 624
C Programlarının Taşınabilirliği 625
Standart Kütüphanelerin Tam Listesi 626
Bundan Sonrası 629
XXVI HER YÖNÜYLE C

You might also like