C Dokümantasyonu
Kısa ve örneklerle anlatılan C kaynağı. Kavramı oku, kodu gör, sonra Coddy yolculuğunda uygula.
Başlarken
- C NedirC, 1972'den kalma, hâlâ işletim sistemlerini, veritabanlarını ve neredeyse her gömülü cihazı çalıştıran küçük, hızlı ve derlenen bir dildir. İşte ne olduğu, nerede çalıştığı ve 2026'da neden öğrenmeye değer olduğu.
- C Kurulumu (GCC)Her sistemde çalışan bir C derleyicisi kurun: Windows'ta MinGW-w64, macOS'ta Apple'ın clang'i ve Linux'ta gcc - ayrıca kurulumun işe yarayıp yaramadığını nasıl kontrol edip ilk dosyanızı nasıl derleyeceğiniz.
- Derle ve ÇalıştırBir .c dosyasını çalışan bir programa dönüştürmek: gcc komutu, ön işleme, derleme ve bağlamanın gerçekte ne yaptığı, ilk günden itibaren kullanmaya değer bayraklar ve başarısız olduğunda hataların nasıl okunacağı.
- C Söz DizimiHer C programının aynı iskeleti vardır: include'lar, bir main fonksiyonu, noktalı virgülle biten deyimler ve süslü parantezler içindeki bloklar. İşte her parçanın ne yaptığı ve derleyicinin gerçekten uyguladığı kurallar.
- YorumlarC'nin iki yorum biçimi vardır - tek satırlık // ve çok satırlı /* */ - farklı geçmişleri ve bir iç içe yerleştirme tuzağıyla. İşte ikisinin de nasıl kullanılacağı, ayrıca neyi yorumlamaya değer neyi değmez.
Değişkenler ve türler
- DeğişkenlerC'de bir değişkenin nasıl bildirileceği, bildirim ile ilk değer verme arasındaki fark, adlandırma kuralları, aynı anda birkaç tane bildirmek ve ilk değersiz bir değişkenin neden en yaygın acemi hatası olduğu.
- Veri TipleriHer C değişkeninin, boyutunu ve neyi tutabileceğini belirleyen bir tipi vardır. İşte tüm temel tipler, gerçek boyutları, işaretli ile işaretsiz, sizeof, limits.h ve taşmada ne olduğu.
- SabitlerC'de asla değişmeyen bir değeri adlandırmanın üç yolu - const anahtar kelimesi, #define makroları ve enum sabitleri - her birinin gerçekte ne olduğu ve ne zaman hangisine uzanmak gerektiği.
- OperatörlerBilmeye değer her C operatörü - aritmetik, atama, karşılaştırma, mantıksal ve artırma - ayrıca tam sayı bölmesi tuzağı, mod operatörünün negatiflerle nasıl davrandığı ve güvenebileceğiniz bir öncelik tablosu.
- BooleanlarC'nin C99'a kadar boolean türü yoktu. Sıfır yanlıştır, geri kalan her şey doğrudur, karşılaştırmalar int üretir - ve stdbool.h bunun üzerine bool, true ve false ekler. Ayrıca bu tasarımın mümkün kıldığı = ile == hatası.
- Tür DönüşümüC sürekli türler arasında dönüşüm yapar - bazen siz bir dönüşümle istediğiniz için, çoğu zaman kendiliğinden. İşte yükseltme kuralları, açık dönüşüm söz dizimi ve veriyi sessizce kaybeden dönüşümler.
Kontrol akışı
- if / elseC nasıl karar verir: if deyimi, else, else if zincirleri, iç içe yerleştirme ve üçlü operatör - ayrıca doğruluk kuralı (0 yanlıştır, geri kalan her şey doğrudur) ve koşulları sessizce bozan = ile == hatası.
- switchC switch deyiminin bir sabit listesinden nasıl tek bir dal seçtiği - case etiketleri, break neden önemli, kasıtlı ve kazara alta düşme, default, char ve enum üzerinde switch ve switch'in bir else-if zincirini ne zaman yendiği.
- for-döngüsüC for döngüsüyle kodun nasıl tekrarlanacağı: üç parçalı başlık, yukarı ve aşağı sayma, sizeof numarasıyla dizileri dolaşma, iç içe döngüler, sonsuz döngüler ve herkesi yakalayan bir-eksik/bir-fazla ile işaretsiz tür hataları.
- while-döngüsüC while döngüsünün bir koşul değişene dek nasıl tekrarladığı - önce-koşul kuralı, nöbetçi döngüleri, EOF'a kadar girdi okumak, while(1) ve for ile while arasında dönüşüm.
- do-while-döngüsüC'nin gövde-önce döngüsü: do-while test etmeden önce bir geçişi nasıl garanti eder, neden noktalı virgülle biter, tam da onun için yapıldığı menü ve yeniden deneme kalıpları ve düz bir while döngüsünden farkı.
- break ve continuebreak bir döngüden ya da switch'ten çıkar; continue bir sonraki geçişe atlar. Her birinin for, while ve do-while içindeki davranışı, iç içe döngülerden bayrak ya da goto ile çıkmak ve döngüleri takip edilmez kılan yanlış kullanımlar.
Fonksiyonlar
- fonksiyonlarC'de fonksiyonların nasıl tanımlanıp çağrılacağı - dönüş tipi, parametreler, dönüş değerleri, void fonksiyonlar, ayrıştırmanın neden önemli olduğu ve küçük adlandırılmış parçalardan kurulmuş eksiksiz bir örnek.
- Fonksiyon parametreleriC her şeyi değerle geçirir - fonksiyonlar kopya alır, asıl nesneyi değil. Bunun pratikte ne anlama geldiği, göstericilerin referansla geçmeyi nasıl taklit ettiği, dizilerin neden farklı davrandığı ve birden fazla sonucun nasıl döndürüleceği.
- Fonksiyon prototipleriC'nin bir fonksiyonun biçimini çağırmadan önce neden görmesi gerektiği - prototip yazmak, örtük bildirim hatalarını gidermek, prototipleri başlık dosyalarına koymak ve f(void) ile f() arasındaki gerçek fark.
- özyinelemeBir C fonksiyonunun kendisini nasıl çağırdığı - onu durduran temel durum, işlenmiş faktöriyel ve Fibonacci, saf Fibonacci'nin neden felaket derecede yavaş olduğu, yığın taşmasının gerçekte ne olduğu ve bir döngünün ne zaman daha iyi cevap olduğu.
- kapsamBir C değişkeninin nerede görünür olduğu ve ne kadar yaşadığı - blok kapsamı, fonksiyon parametreleri, dosya kapsamındaki küreseller, çağrılar arasında yaşayan static yerel değişkenler, static fonksiyonlar, gölgeleme ve küresellerin neden sorun çıkardığı.
İşaretçiler
- GöstericilerGösterici, bir bellek adresi saklayan bir değişkendir. Bu sayfa fikri sıfırdan kuruyor - & ve * operatörleri, gösterici tanımlamak ve dereferans etmek, gösterici tiplerinin neden önemli olduğu ve göstericilerin neden var olduğunu gösteren swap() fonksiyonu.
- Gösterici AritmetiğiBir göstericiye 1 eklemek 1 bayt eklemez - o tipteki bir sonraki nesneye taşır. Bu sayfa ptr+1'i, artırma ve azaltmayı, gösterici farklarını, karşılaştırmaları, bir diziyi göstericiyle dolaşmayı ve sonun-bir-ötesi kuralını ele alıyor.
- Göstericiler ve DizilerC'de bir dizi adı, kullandığınız hemen her yerde ilk elemanına bir göstericiye dönüşür. Bu sayfa o dönüşümü, arr[i]'nin neden harfi harfine *(arr+i) olduğunu, dizi boyutunun neden fonksiyonlara ayrı yolculuk etmesi gerektiğini ve bir diziye göstericinin göstericiler dizisinden nasıl farklı olduğunu açıklıyor.
- Fonksiyon GöstericileriFonksiyonların da adresi vardır ve bir fonksiyon göstericisi bir tanesini saklar. Bu sayfa bildirim söz dizimini çözüyor, typedef'in onu nasıl okunaklı kıldığını gösteriyor ve geri çağrılara, özel karşılaştırıcılı qsort'a ve dağıtım tablolarına doğru ilerliyor.
- NULL GöstericilerNULL, bir göstericinin hiçbir şeyi göstermediğinde tuttuğu adrestir. Bu sayfa NULL'un gerçekte ne olduğunu, onu dereferans etmenin neden çökmeye yol açtığını, 0'dan ve ilk değersiz bir göstericiden nasıl farklı olduğunu ve null hatalarını kodunuzdan uzak tutan savunmacı kalıpları ele alıyor.
Diziler ve dizeler
- DizilerC'de dizilerin nasıl tanımlanıp ilk değer verileceği, sıfırdan indekslenmesi, uzunluğun sizeof ile hesaplanması, elemanlar üzerinde döngü kurulması ve sonun ötesini okumanın neden bir hata mesajı değil tanımsız davranış olduğu.
- Çok Boyutlu DizilerC'de 2B dizilerin nasıl tanımlanacağı, ilk değer verileceği ve üzerlerinde döngü kurulacağı, satır-öncelikli yerleşimin bellekte gerçekte ne anlama geldiği, bir 2B diziyi bir fonksiyona geçirmenin neden sütun sayısını gerektirdiği ve işlenmiş bir matris örneği.
- MetinlerC'nin metin türü yoktur - metin, '\0' baytıyla biten bir char dizisidir. Bu sayfa o zihinsel modeli kurar, ardından sabitleri, yazdırmayı, dolaşmayı ve bir metni neden = ile kopyalayamayacağınızı ele alır.
- Metin Fonksiyonları<string.h>'in çalışan bir turu: strlen ile ölçmek, strcpy ve strncpy ile kopyalamak, strcat ile birleştirmek, strcmp ile karşılaştırmak, strchr ve strstr ile aramak - ve hiçbirinin taşmaması için tamponları nasıl boyutlandıracağınız.
- Metin DönüşümüC'de metin ile sayı arasında dönüşüm: atoi neden hata bildiremez, strtol ve strtod'u endptr ve errno ile doğru kullanmak, snprintf ile sayıları metne çevirmek ve '0' ile tek basamak numaraları.
Dinamik bellek
- Dinamik BellekÖbeğin (heap) neden var olduğu, malloc'un boyutu çalışma zamanında belirlenen belleği size nasıl verdiği, p = malloc(n * sizeof *p) deyimi, NULL denetimi, tam olarak bir kez serbest bırakmak ve baştan sona işlenmiş bir dinamik dizi.
- calloc ve realloccalloc size sıfırlanmış bellek verir ve boyutu güvenle çarpar; realloc ise zaten doldurduğunuz bir bloğu büyütür. Bu sayfa ikisini de, başarısız bir realloc'un sızıntı yapmasını önleyen geçici gösterici deyimini ve calloc'un malloc artı memset'i ne zaman yendiğini ele alıyor.
- Bellek SızıntılarıBir sızıntının gerçekte ne olduğu, C programlarının onları üretmesinin üç yolu, onları önleyen sahiplik disiplini ve gerisini valgrind ve -fsanitize=address ile nasıl bulacağınız - adım adım düzeltilen sızdıran bir programla bitiyor.
- Yığın ve ÖbekVerinizin gerçekte nerede yaşadığı: yığındaki otomatik depolama, öbekteki dinamik depolama ve üçüncü bölge olarak statik depolama - bir yereli döndürmekten doğan klasik sarkan gösterici hatası ve bir seçim kuralıyla.
Yapılar, birlikler ve enumlar
- yapılarC yapısıyla ilişkili değerleri tek bir tipte nasıl gruplayacağınız - onu bildirmek, üyelere nokta operatörüyle erişmek, belirtilmiş ilk değerler, yapı dizileri, iç içe yerleştirme ve herkesi şaşırtan geçerken-kopyalama kuralı.
- yapılar-ve-göstericilerC'de bir yapıyı nasıl göstereceğiniz - ok operatörü, (*p).x neden parantezlerine ihtiyaç duyar, yapıları değiştirmek ya da kopyalardan kaçınmak için gösterici ile geçirmek, bir yapıyı malloc'lamak ve bağlı liste düğümü kurmak.
- typedeftypedef'in var olan bir C tipine nasıl yeni bir isim verdiği - etiketli ve etiketsiz typedef struct deyimi, fonksiyon göstericileri ve diziler için typedef'ler ve typedef'in zarar verdiği tek durum: bir göstericiyi gizlemek.
- birleşimlerBir C birleşiminin birkaç türü aynı baytlarda nasıl sakladığı - boyutu neden en büyük üye, en son yazdığınız üyeyi neden okumanız gerekir ve etiketli bir birleşimin (enum artı union) bunu nasıl güvenli kıldığı.
- enum'larC'de bir enum nasıl tanımlanır - otomatik numaralama, açık değerler, derleyicinin eksik durumları yakalaması için enum'ları switch içinde kullanmak, bir enum'u metne çevirmek ve onları okunaklı tutan adlandırma gelenekleri.
Girdi ve çıktı
- printfprintf'in C'de gerçekte nasıl çalıştığı - biçim metni modeli, her gün kullandığınız belirteçler, hizalı çıktı için genişlik ve hassasiyet, float'ları makul biçimde yazdırmak, dönüş değeri ve printf(kullanici_girdisi)'nin neden bir güvenlik açığı olduğu.
- scanfC'de scanf ile girdinin nasıl okunacağı - & neden zorunludur, boşluk nasıl ele alınır, %s tampon taşması ve genişlik çözümü, dönüş değerini denetlemek, artık-satır-sonu hatası ve sağlam alternatif olarak fgets.
- biçim-belirteçleriTek yerde her C biçim belirteci - %d, %s, %c, %f, %p ve gerisi ne anlama gelir, l, ll, h ve z uzunluk değiştiricileri, genişlik, hassasiyet ve bayraklar ve hangilerinin printf ile scanf arasında farklılaştığı.
- dosya-işlemleriC'de dosyaların nasıl okunup yazılacağı - fopen kip tablosu, NULL denetimi, fprintf ve fputc ile yazmak, fgets, fscanf ve fgetc ile okumak, klasik satır satır döngüsü ve ikili kipin ne zaman kullanılacağı.
- komut-satırı-argümanlarıBir C programının komut satırını nasıl okuduğu - argc ve argv'nin anatomisi, argümanlar üzerinde dolaşma, argv[0]'ın ne tuttuğu, atoi yerine strtol ile sayıya dönüştürme ve hepsini bir araya getiren küçük bir hesap makinesi.
Ön işlemci
- ön-işlemciÖn işlemci, derleyici görmeden önce kaynak metninizi düzenler - başlıkları yapıştırır, makroları yerleştirir ve kodu açıp kapatır. İşte tüm yönerge ailesi ve çıktısına nasıl bakacağınız.
- makrolar#define ile nesne benzeri ve fonksiyon benzeri makrolar - her argümanın ve tüm gövdenin neden parantez istediği, çoklu değerlendirme tuzağı, do-while(0) ile çok satırlı makrolar ve bir fonksiyonun ya da const'un ne zaman daha iyi araç olduğu.
- başlık-dosyalarıBir C programını dosyalara bölmek: neyin .h'ye, neyin .c'ye ait olduğu, çifte dahil etmeyi engelleyen include korumaları, birkaç dosyayı birlikte derlemek ve extern ile küresel değişken paylaşmak.
- koşullu-derleme#ifdef, #ifndef, #if, #elif ve #else ile farklı derlemeler için farklı kod derleyin - hata ayıklama anahtarları, platform dalları, komut satırından -D ile makro tanımlama ve kodu devre dışı bırakmak için #if 0.
Standart kütüphane
- matematik-fonksiyonlarımath.h turu - sqrt, pow, fabs, floor ve ceil, round, fmod, trigonometri ve logaritma aileleri, INFINITY ve NAN - ayrıca klasik undefined reference hatasına yol açan -lm bağlayıcı bayrağı.
- rastgele-sayılarC'de rand() ve RAND_MAX ile rastgele sayıların nasıl üretileceği, neden tam olarak bir kez srand(time(NULL)) ile tohumladığınız, % ile bir aralığa eşlemek ve getirdiği küçük yanlılık, rastgele double'lar ve yeniden üretilebilir diziler.
- standart-kütüphaneHer standart başlığın size ne verdiği - stdio.h, stdlib.h, string.h, math.h, time.h, ctype.h, limits.h, stdbool.h, stdint.h ve assert.h - her birinin kısa çalışan bir örneğiyle.
Hatalar ve hata ayıklama
- Segmentation FaultSegfault, programınızın sahibi olmadığı belleğe dokunduğu anlamına gelir. İşte neredeyse hepsini açıklayan beş sebep; her biri en küçük örneği ve çözümüyle, ayrıca gdb ve AddressSanitizer ile tam satırı nasıl bulacağınız.
- sık-yapılan-hatalarHer C programcısının en az bir kez yaptığı hatalar - eksik noktalı virgüller, == yerine =, örtük bildirimler, & olmadan scanf, metinleri == ile karşılaştırmak, tam sayı bölmesi, ilk değersiz değişkenler ve bir-eksik/bir-fazla - her biri belirti, sebep ve çözüm olarak.
- tanımsız-davranışTanımsız davranış, C standardının hiçbir gereksinim koymadığı koddur - dolayısıyla iyileştiricinin denetimlerinizi silmesi dahil her şey olabilir. İşte ona ne yol açtığı, "benim makinemde çalışıyor"un neden hiçbir şey kanıtlamadığı ve onu yakalayan bayraklar.