C Programlama Nasıl Çalışır?

Oct 19 2011
Bir bilgisayar programı dijital şehrin anahtarıdır: Eğer dili biliyorsanız, hemen hemen istediğiniz her şeyi yapacak bir bilgisayara sahip olabilirsiniz. C'nin nasıl çalıştığını ve neden bu kadar önemli olduğunu öğrenin.
C programlama dili, bilgisayarınızın belleği üzerinde daha fazla kontrol de dahil olmak üzere, diğer birçok dilden daha fazla çok yönlülük sağlar.

C programlama dili inanılmaz derecede popülerdir ve nedenini görmek kolaydır. C dilinde programlama verimlidir ve programcıya büyük ölçüde kontrol sağlar. C++, Java ve Python gibi diğer birçok programlama dili, C kullanılarak geliştirildi.

Bir programcıysanız, C'yi yalnızca işiniz için kullanmama ihtimaliniz her geçen gün artıyor. Bununla birlikte, düzenli olarak kullanmasanız bile, C'nin oldukça faydalı olduğu birkaç öğrenme vardır. İşte nedeni:

Küçük mikrodenetleyicilerden masaüstü, dizüstü ve mobil işletim sistemlerine kadar her şey dahil olmak üzere birçok farklı türde bilgisayar platformunda kullanılabilen yazılımlar için kod okuyup yazabileceksiniz.

Bellek yönetimi ve çöp toplama gibi üst düzey dillerin perde arkasında ne yaptığını daha iyi anlayacaksınız. Bu anlayış, daha verimli çalışan programlar yazmanıza yardımcı olabilir.

Bir bilgi teknolojisi (BT) uzmanıysanız, C öğrenmekten de yararlanabilirsiniz. BT uzmanları genellikle işlerinin bir parçası olarak komut dosyaları yazar, sürdürür ve çalıştırır. Bir komut dosyası takip etmek bir bilgisayarın işletim sistemi için talimatlar listesidir. Belirli komut dosyalarını çalıştırmak için bilgisayar, kabuk adı verilen kontrollü bir yürütme ortamı kurar . Çoğu işletim sistemi C'ye dayalı kabuk çalıştırdığından, C kabuğu , BT uzmanları tarafından kullanılan popüler bir C komut dosyası uyarlamasıdır.

Bu makale, C'nin arkasındaki geçmişi ele alır, C'nin neden bu kadar önemli olduğuna bakar, bazı temel C kodlarının örneklerini gösterir ve veri türleri, işlemler, işlevler, işaretçiler ve bellek yönetimi dahil olmak üzere C'nin bazı önemli özelliklerini araştırır. Bu makale, C'de programlama için bir talimat kılavuzu olmamasına rağmen, ortalama C programlama kılavuzunun ilk birkaç bölümünün ötesine geçen bir şekilde C programlamayı benzersiz kılan şeyleri kapsar.

C programlama dilinin nereden geldiğine, nasıl geliştiğine ve günümüzde yazılım geliştirmedeki rolüne bakarak başlayalım.

İçindekiler
  1. C nedir?
  2. C Kodunu Düzenleme ve Derleme
  3. En Basit C Programı
  4. C'de Ortak Programlama Kavramları
  5. C'deki Fonksiyonlar
  6. Fonksiyon Prototipleri
  7. C'deki Veri Tipleri ve İşlemler
  8. Sıfırdan Başlamayın, Kitaplıkları Kullanın
  9. C'deki İşaretçiler hakkında bazı İşaretçiler
  10. C'de İşaretçileri Doğru Kullanmak
  11. C'de Bellek Yönetiminin Önemi

C nedir?

C'yi tanımlamanın en basit yolu, onu bir bilgisayar programlama dili olarak adlandırmaktır, yani onunla bir bilgisayarın çalıştırabileceği bir yazılım yazabilirsiniz. Sonuç, Web tarayıcınız gibi büyük bir bilgisayar uygulaması veya bir mikroişlemciye veya başka bir bilgisayar bileşenine yerleştirilmiş küçük bir talimat dizisi olabilir.

C dili 1970'lerin başında Bell Laboratories'de geliştirildi ve öncelikle Ken Thompson ve Dennis Ritchie'nin çalışmalarına atfedildi. Programcıların UNIX işletim sistemi için daha kullanıcı dostu bir dizi talimata ihtiyaçları vardı ve bu komutlar o zamanlar programların montaj dilinde yazılmasını gerektiriyordu. Doğrudan bir bilgisayarın donanımıyla konuşan derleme programları uzun ve hata ayıklaması zordur ve yeni özellikler [kaynak: King] eklemek için sıkıcı, zaman alıcı çalışmalar gerektirmiştir.

Thompson'ın üst düzey bir dilde ilk girişimi, temel aldığı sistem programlama dili BCPL'ye bir övgü olan B olarak adlandırıldı. Bell Labs, Digital Equipment Corporation (DEC) UNIX sistem modeli PDP-11'i satın aldığında, Thompson daha yeni ve daha iyi sistem donanımının taleplerine daha iyi uyması için B'yi elden geçirdi. Böylece B'nin halefi C doğdu. 1973'te C, UNIX'in bu yenilikçi yeni üst düzey dil [kaynak: King] kullanılarak yeniden yazılabilmesi için yeterince kararlıydı.

C, Bell Laboratuarlarının ötesinde etkili bir şekilde kullanılmadan önce, diğer programcıların nasıl kullanılacağını açıklayan bir belgeye ihtiyaçları vardı. 1978'de Brian Kernighan ve Dennis Ritchie'nin C meraklıları tarafından K&R veya "Beyaz Kitap" olarak bilinen "C Programlama Dili" kitabı, C programlama için kesin kaynak oldu. Bu yazı yazılırken, K&R'nin ilk olarak 1988'de yayınlanan ikinci baskısı hala yaygın olarak mevcuttur. C'nin orijinal, standart öncesi sürümü, bu kitaba dayalı olarak K&R C olarak adlandırılır.

İnsanların zamanla kendi lehçelerini yaratmamalarını sağlamak için, C geliştiricileri 1980'ler boyunca dil için standartlar oluşturmak için çalıştı. C için ABD standardı, Amerikan Ulusal Standartlar Enstitüsü (ANSI) standardı X3.159-1989, 1989'da resmi hale geldi. Uluslararası Standardizasyon Örgütü (ISO) standardı, ISO/IEC 9899: 1990, 1990'da bunu takip etti. K&R bu standartlara ve sonraki revizyonlarına (C89, C90 ve C99) atıfta bulunduktan sonra. Ayrıca "ANSI C", "ANSI/ISO C" veya "ISO C" olarak adlandırılan C89'u da görebilirsiniz.

C ve UNIX'te kullanımı, 1980'ler boyunca işletim sistemi geliştirmedeki patlamanın sadece bir parçasıydı. Öncüllerine göre tüm iyileştirmelerine rağmen, C, daha büyük yazılım uygulamaları geliştirmek için hala zahmetsiz değildi. Bilgisayarlar daha güçlü hale geldikçe, daha kolay bir programlama deneyimi için talep arttı. Bu talep, programcıları C kullanarak kendi derleyicilerini ve dolayısıyla kendi yeni programlama dillerini oluşturmaya sevk etti. Bu yeni diller, çok sayıda hareketli parça içeren karmaşık görevleri kodlamayı basitleştirebilir. Örneğin, her ikisi de C'den geliştirilen C++ ve Java gibi diller, basitleştirilmiş nesne yönelimli programlama, bir programcının kodu yeniden kullanma yeteneğini optimize eden bir programlama yaklaşımı.

Artık biraz arka plan bildiğinize göre, hadi C'nin kendi mekaniğine bakalım.

C Kodunu Düzenleme ve Derleme

C'ye derlenmiş dil denir, yani kodu çalıştırmadan önce yürütülebilir bir dosyaya dönüştürmek için bir derleyici kullanmanız gerekir. Kod, Windows'ta Notepad, Mac'te TextEdit ve Linux'ta gedit gibi herhangi bir metin düzenleyicide açabileceğiniz, okuyabileceğiniz ve düzenleyebileceğiniz bir veya daha fazla metin dosyasına yazılır. Yürütülebilir dosya, bilgisayarın çalıştırabileceği (yürütebileceği) bir şeydir. Derleyici kodu hatalara karşı kontrol eder ve eğer hatasız görünüyorsa, yürütülebilir bir dosya oluşturur.

C koduna ne girdiğine bakmadan önce, bir C derleyicisi bulabileceğimizden ve kullanabileceğimizden emin olalım. Mac OS X ve çoğu Linux dağıtımını (Ubuntu gibi) kullanıyorsanız, söz konusu işletim sistemi için geliştirme araçları yazılımını yüklerseniz bilgisayarınıza bir C derleyicisi ekleyebilirsiniz. Bu ücretsiz C derleyicileri komut satırı araçlarıdır; bu, bunları genellikle bir terminal penceresindeki komut isteminden çalıştıracağınız anlamına gelir. Bu C derleyicilerinden birini çalıştırma komutu "cc" veya "gcc" artı bazı komut satırı seçenekleri ve bağımsız değişkenlerdir; bunlar, siz Enter'a basmadan önce komuttan sonra yazılan diğer kelimelerdir.

Microsoft Windows kullanıyorsanız veya komut satırı yerine grafik kullanıcı arabirimi kullanmayı tercih ediyorsanız, C programlama için entegre bir geliştirme ortamı (IDE) kurabilirsiniz. IDE, kodunuzu yazabileceğiniz, derleyebileceğiniz, test edebileceğiniz ve hataları hızla bulup düzeltebileceğiniz tek bir arabirimdir. Windows için, hem C hem de C++ programlama için bir IDE olan Microsoft Visual C++ yazılımını satın alabilirsiniz. Bir başka popüler IDE, Windows, Mac ve Linux üzerinde çalışan ve C ve diğer birçok programlama dilini derlemek için kullanılabilen uzantılara sahip Java tabanlı ücretsiz bir IDE olan Eclipse'dir.

C için diğer bilgisayar programlama dillerinde olduğu gibi kullandığınız derleyicinin versiyonu çok önemlidir. Her zaman, programınızda kullandığınız C dilinin sürümünden daha yeni veya daha yeni olan bir C derleyicisi sürümünü kullanmak istersiniz. Bir IDE kullanıyorsanız, IDE'nin üzerinde çalıştığınız program için hedef C sürümünüzü kullandığından emin olmak için ayarlarınızı yaptığınızdan emin olun. Komut satırındaysanız, sürümü aşağıdaki komutta olduğu gibi değiştirmek için bir komut satırı bağımsız değişkeni ekleyebilirsiniz:

gcc –std c99 –o programım.exe programım.c

Yukarıdaki komutta "gcc", derleyiciyi çalıştırma çağrısıdır ve diğer her şey bir komut satırı seçeneği veya argümanıdır. Derleyiciye derleme sırasında C'nin C99 standart sürümünü kullanmasını söylemek için "-std" seçeneği ve ardından "c99" eklendi. Derleyicinin çıktı dosyası olan yürütülebilir dosyanın myprogram.exe olarak adlandırılmasını istemek için "-o" seçeneği ve ardından "programım.exe" eklendi. "-o" olmadan yürütülebilir dosya otomatik olarak a.out olarak adlandırılır. Son argüman "programım.c", derlenecek C kodunu içeren metin dosyasını belirtir. Kısacası, bu komut, "Hey, gcc, programımı.c'yi C99 C programlama standardını kullanarak derleyin ve sonuçları programım.exe adlı bir dosyaya koyun" diyor.İster gcc ister başka bir şey olsun, kendi derleyicinizle kullanabileceğiniz seçeneklerin tam listesi için Web'e göz atın.

Derleyiciniz yüklendiğinde, C'de programlamaya hazırsınız. Yazabileceğiniz en basit C programlarından birinin temel yapısına bir göz atarak başlayalım.

En Basit C Programı

Basit bir C programına bakalım ve onu hem C'nin temellerini hem de C derleme sürecini anlamak için kullanalım. Daha önce açıklandığı gibi yüklenmiş bir C derleyicisine sahip kendi bilgisayarınız varsa, sample.c adında bir metin dosyası oluşturabilir ve bu örneği adım adım ilerlerken takip etmek için kullanabilirsiniz. Dosya adında .c'yi bırakırsanız veya düzenleyiciniz isme .txt eklerse, onu derlerken muhtemelen bir tür hata alacağınızı unutmayın.

İşte örnek programımız:

/* Örnek program */

#Dahil etmek

int ana()

{

printf("Bu benim ilk programımdan çıktı!\n");

0 döndür;

}

Derlendiğinde ve çalıştırıldığında, bu program bilgisayara "Bu benim ilk programımdan çıktı!" satırını yazdırmasını söyler. ve sonra dur. Bundan daha basit olamazsın! Şimdi her satırın ne yaptığına bir göz atalım:

Satır 1 -- Bu, bir veya daha fazla satırda /* ve */ arasında C dilinde yorum yazmanın bir yoludur.

2. Satır -- #include komutu, derleyiciye mevcut C kodu için diğer kaynaklara, özellikle de yaygın yeniden kullanılabilir talimatları içeren dosyalar olan kitaplıklara bakmasını söyler. Bir kullanıcıdan girdi alma ve ekrana çıktı yazma işlevlerine sahip standart bir C kitaplığına başvurur. Kütüphanelere daha sonra daha yakından bakacağız.

Satır 3 -- Bu satır, bir işlev tanımının ilk satırıdır. Her C programının en az bir işlevi veya program çalıştığında bilgisayarın yapması gereken bir şeyi temsil eden bir kod bloğu vardır. İşlev görevini yerine getirir ve ardından diğer işlevler tarafından kullanılabilecek bir dönüş değeri adı verilen bir yan ürün üretir. En azından programın, tamsayı anlamına gelen int veri tipiyle bir dönüş değeriyle burada gösterilene benzer main adında bir işlevi vardır. Fonksiyonları daha sonra incelediğimizde boş parantezlerin ne anlama geldiğini göreceksiniz.

Satır 4 ve 7 -- Bir fonksiyon içindeki komutlar parantez içine alınır. Bazı programcılar burada gösterildiği gibi ayraç içine alınmış bir bloğu ayrı satırlarda başlatır ve bitirir. Diğerleri, işlev tanımının ilk satırının sonuna açık ayraç ({) koyar. Programdaki kod satırlarının ayrı satırlara yazılması gerekmese de, programcılar kodun daha sonra okunmasını ve düzenlenmesini kolaylaştırmak için genellikle her talimatı boşluklarla girintili ayrı bir satıra koyar.

Satır 5 -- Bu, printf adlı bir işleve yapılan bir işlev çağrısıdır. Bu işlev, 1. Satırda bulunan stdio.h kitaplığında kodlanmıştır, bu nedenle onu kendiniz yazmanız gerekmez. Bu printf çağrısı, ekrana ne yazdırılacağını söyler. Sondaki \n, tırnak işaretleri içinde olsa da yazdırılmaz; printf'e imleci ekrandaki bir sonraki satıra taşımasını söyleyen bir kaçış dizisidir. Ayrıca gördüğünüz gibi fonksiyondaki her satır noktalı virgülle bitmelidir.

6. Satır -- Bir değer döndüren her işlev, bunun gibi bir dönüş ifadesi içermelidir. C'de ana işlev, program içinde kullanılmasa bile her zaman bir tamsayı dönüş tipine sahip olmalıdır. Bir C programı çalıştırırken, esasen onun ana işlevini çalıştırdığınızı unutmayın. Bu nedenle, programı test ederken, bilgisayara programı çalıştırmanın dönüş değerini göstermesini söyleyebilirsiniz. Programcılar genellikle programın başarılı bir şekilde çalıştığını doğrulamak için testte bu değeri aradığından 0 dönüş değeri tercih edilir.

Programınızı test etmeye hazır olduğunuzda, dosyayı kaydedin ve programı derleyin ve çalıştırın. Bir komut satırında gcc derleyicisini kullanıyorsanız ve program sample.c adlı bir dosyadaysa, onu aşağıdaki komutla derleyebilirsiniz:

gcc -o sample.exe sample.c

Kodda herhangi bir hata yoksa, bu komutu çalıştırdıktan sonra sample.c ile aynı dizinde sample.exe adlı bir dosyanız olmalıdır. En yaygın hata sözdizimi hatasıdır, yani bir satırın sonunda noktalı virgül bırakmak veya tırnakları veya parantezleri kapatmamak gibi bir şeyi yanlış yazmışsınızdır. Değişiklik yapmanız gerekiyorsa, dosyayı metin düzenleyicinizde açın, düzeltin, değişikliklerinizi kaydedin ve derleme komutunuzu yeniden deneyin.

Sample.exe programını çalıştırmak için aşağıdaki komutu girin. Yürütülebilir dosyayı bulmak için bilgisayarı geçerli dizine bakmaya zorlayan ./ dosyasını not edin:

./sample.exe

Bunlar, C için kodlama ve derlemenin temelleridir, ancak diğer C programlama kaynaklarından derleme hakkında öğrenebileceğiniz daha çok şey vardır. Şimdi kutuyu açalım ve C'nin program oluşturmak için hangi parçalarına sahip olduğunu görelim.

C'de Ortak Programlama Kavramları

Bazı yaygın programlama kavramlarını C kodunuzda nasıl uygulamaya koyacağınıza bir göz atalım. Aşağıda bu kavramların kısa bir özeti verilmiştir:

İşlevler -- Daha önce belirtildiği gibi, bir işlev, program çalışırken bilgisayarın yapması gereken bir şeyi temsil eden bir kod bloğudur. Bazı diller bu yapı yöntemlerini çağırır, ancak C programcıları genellikle bu terimi kullanmaz. Programınız birkaç fonksiyon tanımlayabilir ve bu fonksiyonları diğer fonksiyonlardan çağırabilir. Daha sonra, C'deki fonksiyonların yapısına daha yakından bakacağız.

Değişkenler -- Bir programı çalıştırdığınızda, bazen değerlerin önceden ne olduğunu bilmeden programı çalıştırma esnekliğine ihtiyaç duyarsınız. Diğer programlama dilleri gibi C, bu esnekliğe ihtiyaç duyduğunuzda değişkenleri kullanmanıza izin verir. Cebirdeki değişkenler gibi, bilgisayar programlamadaki bir değişken de bilmediğiniz veya henüz bulamadığınız bir değeri temsil eden bir yer tutucudur.

Veri türleri -- Programınız çalışırken verileri bellekte depolamak ve bu veriler üzerinde hangi işlemleri yapabileceğinizi bilmek için C gibi bir programlama dili tanıyacağı belirli veri türlerini tanımlar. C'deki her veri türünün, ikili bitler veya baytlarla ölçülen belirli bir boyutu ve bitlerinin neyi temsil ettiğiyle ilgili belirli bir dizi kuralı vardır. Birazdan, C kullanırken görev için doğru veri türünü seçmenin ne kadar önemli olduğunu göreceğiz.

İşlemler -- C'de sayılar üzerinde aritmetik işlemler (toplama gibi) ve karakter dizileri üzerinde dize işlemleri (birleştirme gibi) gerçekleştirebilirsiniz. C ayrıca, verilerinizle yapmak isteyebileceğiniz şeyler için özel olarak tasarlanmış yerleşik işlemlere sahiptir. C'deki veri türlerini kontrol ettiğimizde, işlemlere de kısaca göz atacağız.

Döngüler - Bir programcının yapmak isteyeceği en temel şeylerden biri, program çalışırken ortaya çıkan belirli koşullara bağlı olarak bir eylemi birkaç kez tekrarlamaktır. Belirli koşullara göre tekrarlanmak üzere tasarlanmış bir kod bloğuna döngü denir ve C dili şu ortak döngü yapılarını sağlar: while, do/while, for, Continue/break ve goto. C ayrıca ortak if/then/else şartlarını ve switch/case deyimlerini de içerir.

Veri yapıları -- Programınızın işlemesi gereken çok fazla veri olduğunda ve bu verileri sıralamanız veya aramanız gerektiğinde, muhtemelen bir tür veri yapısı kullanacaksınız. Bir veri yapısı, aynı veri türünden birkaç veri parçasını temsil etmenin yapılandırılmış bir yoludur. En yaygın veri yapısı, yalnızca belirli bir boyutun dizine alınmış bir listesi olan bir dizidir. C, bazı ortak veri yapılarını işlemek için kitaplıklara sahiptir, ancak her zaman işlevler yazabilir ve kendi yapılarınızı da kurabilirsiniz.

Önişlemci işlemleri -- Bazen, yürütülebilir dosyaya derlemeden önce derleyiciye kodunuzla ilgili bazı talimatlar vermek istersiniz. Bu işlemler, sabit değerleri değiştirmeyi ve C kitaplıklarından (daha önce örnek kodda gördüğünüz) kodu dahil etmeyi içerir.

C ayrıca programcıların birçok programlama dilinin basitleştirdiği veya otomatikleştirdiği bazı kavramları işlemesini gerektirir. Bunlara işaretçiler, bellek yönetimi ve çöp toplama dahildir. Sonraki sayfalar, C'de programlama yaparken bu kavramlar hakkında bilinmesi gereken önemli şeyleri kapsar.

Halihazırda bir programcı değilseniz, kavramlara bu hızlı genel bakış bunaltıcı görünebilir. Yoğun bir C programlama kılavuzunu ele almaya geçmeden önce, yukarıda listelenenler arasında işlevlerden başlayarak temel kavramlara kullanıcı dostu bir göz atalım.

C'deki Fonksiyonlar

Çoğu bilgisayar programlama dili, bir tür işlevler oluşturmanıza izin verir. Fonksiyonlar, program boyunca bu bölümleri yeniden kullanabilmeniz için uzun bir programı adlandırılmış bölümlere ayırmanıza izin verir. Bazı diller için programcılar, özellikle nesne yönelimli programlama teknikleri kullananlar, işlev yerine yöntem terimini kullanır .

Fonksiyonlar parametreleri kabul eder ve bir sonuç döndürür. Bir işlevi içeren kod bloğu, onun işlev tanımıdır. Aşağıdaki, bir fonksiyon tanımının temel yapısıdır:

( )

{

dönüş ;

}

En azından, bir C programının main adında bir işlevi vardır. Derleyici, ana işlev içindeki diğer işlevleri çağırsa bile, programın başlangıç ​​noktası olarak bir ana işlevi arayacaktır. Daha önce incelediğimiz basit C programında gördüğümüz ana şey aşağıdadır. Dönüş tipi bir tamsayıya sahiptir, parametre almaz ve biri dönüş ifadesi olan iki ifadeye (işlev içindeki talimatlar) sahiptir:

int ana()

{

printf("Bu benim ilk programımdan çıktı!\n");

0 döndür;

}

main dışındaki işlevlerin bir tanımı ve bir veya daha fazla işlev çağrısı vardır. Bir işlev çağrısı, başka bir işlev içindeki bir ifade veya ifadenin bir parçasıdır. İşlev çağrısı, aradığı işlevi parantezler ile adlandırır. İşlevin parametreleri varsa, işlev çağrısı bu parametrelerle eşleşmesi için karşılık gelen değerleri içermelidir. Fonksiyon çağrısının bu ek parçasına fonksiyona parametre geçişi denir.

Ama parametreler nelerdir? Bir işlev için parametre, işlevin işini yapması için gereken belirli bir veri türündeki bir veri parçasıdır. C'deki işlevler, bazen bağımsız değişkenler olarak adlandırılan sınırsız sayıda parametreyi kabul edebilir. Bir fonksiyon tanımına eklenen her parametre iki şeyi belirtmelidir: veri tipi ve fonksiyon bloğu içindeki değişken adı. Birden çok parametre virgülle ayrılır. Aşağıdaki fonksiyonda, her ikisi de tamsayı olan iki parametre vardır:

int doubleAndAdd(int a, int b)

{

dönüş ((2*a)+(2*b));

}

Daha sonra, daha büyük bir C programına nasıl uyduklarına bakmak için uzaklaştırarak fonksiyonlara bakmaya devam edelim.

Fonksiyon Prototipleri

C'de, programın herhangi bir yerine bir fonksiyon tanımı ekleyebilirsiniz (başka bir fonksiyon dışında). Tek koşul, derleyiciye işlevin kodun daha sonraki bir yerinde bulunduğunu önceden söylemeniz gerektiğidir. Bunu programın başında bir fonksiyon prototipi ile yapacaksınız. Prototip, tanımın ilk satırına benzeyen bir ifadedir. C'de prototipteki parametrelerin isimlerini vermeniz gerekmez, sadece veri tiplerini vermeniz gerekir. DoubleAndAdd işlevi için işlev prototipinin nasıl görüneceği aşağıdadır:

int doubleAndAdd(int, int);

Fonksiyon prototiplerini programınız için paketleme listesi olarak hayal edin. Derleyici, tıpkı yeni bir kitaplık paketini açıp monte edebileceğiniz gibi, programınızı paketinden çıkaracak ve bir araya getirecektir. Paket listesi, kitaplığı monte etmeye başlamadan önce ihtiyacınız olan tüm parçaların kutuda olduğundan emin olmanıza yardımcı olur. Derleyici, programınızı birleştirmeye başlamadan önce fonksiyon prototiplerini aynı şekilde kullanır.

Daha önce incelediğimiz sample.c programını takip ediyorsanız, burada gösterilen doubleAndAdd işlevi için bir işlev prototipi, işlev tanımı ve işlev çağrısı eklemek için dosyayı açın ve düzenleyin. Ardından, yeni kodun nasıl çalıştığını görmek için programınızı önceki gibi derleyin ve çalıştırın. Denemek için aşağıdaki kodu kılavuz olarak kullanabilirsiniz:

#Dahil etmek

int doubleAndAdd(int, int);

int ana()

{

printf("Bu benim ilk programımdan çıktı!\n");

printf("Eğer ikiye katlarsanız, 2 ve 3 eklerseniz, sonuç: %d \n", doubleAndAdd(2,3));

0 döndür;

}

int doubleAndAdd(int a, int b)

{

dönüş ((2*a)+(2*b));

}

Şimdiye kadar bir C programında bazı temel yapısal unsurlara baktık. Şimdi bir C programında çalışabileceğiniz veri türlerine ve bu veriler üzerinde hangi işlemleri yapabileceğinize bakalım.

Fonksiyon Bildirimleri

C'de, özellikle eski C programcıları arasında, muhtemelen işlev bildirimi terimini işlev prototipinden daha fazla duyacaksınız. Bununla birlikte, önemli bir ayrımı olduğu için bu makalede fonksiyon prototipi terimini kullanıyoruz. Başlangıçta, bir işlev bildirimi herhangi bir parametre gerektirmediğinden, dönüş türü, işlev adı ve bir çift boş parantez yeterliydi. Ancak bir işlev prototipi, derleyiciye çağıracağı parametrelerin sayısını ve veri türlerini ekleyerek önemli ek bilgiler verir. Prototipler, günümüzde kodlayıcılar arasında C ve diğer programlama dillerinde en iyi uygulama yaklaşımı haline geldi.

C'deki Veri Tipleri ve İşlemler

Bilgisayarınızın bakış açısından, programınız sadece birler ve sıfırlar dizisidir. C'deki veri türleri, bilgisayara bu bitlerden bazılarının nasıl kullanılacağını söyler.

Bilgisayarınızın bakış açısından, veriler, sabit sürücünüzdeki veya bilgisayarınızın işlemcisi veya belleğindeki elektronik bitlerin açık ve kapalı durumlarını temsil eden birler ve sıfırlar dizisinden başka bir şey değildir. Bu milyarlarca ikili basamaktan nasıl anlam çıkarılacağını belirleyen, bilgisayarda çalıştırdığınız yazılımdır. C, verileri belirli bir veri türüne göre yorumlamanın yanı sıra bit düzeyinde verileri kolayca değiştirebilen birkaç üst düzey dilden biridir.

Bir veri türü, bir dizi bitin nasıl anlamlandırılacağını gösteren küçük bir kurallar dizisidir. Veri türünün belirli bir boyutu ve bu tür veriler üzerinde kendi işlemleri (toplama ve çarpma gibi) gerçekleştirme şekli vardır. C'de, veri türünün boyutu kullandığınız işlemciyle ilgilidir. Örneğin, C99'da, tamsayı veri türündeki (int) bir veri parçası 16 bit işlemcide 16 bit uzunluğundayken, 32 bit ve 64 bit işlemciler için 32 bit uzunluğundadır.

C programcılarının bilmesi gereken bir diğer önemli şey de dilin işaretli ve işaretsiz veri türlerini nasıl işlediğidir. İşaretli bir tür, bitlerinden birinin pozitif veya negatif bir sayı olup olmadığının göstergesi olarak ayrıldığı anlamına gelir. Bu nedenle, 16 bitlik bir sistemde imzasız bir int 0 ile 65.535 arasındaki sayıları işleyebilirken, aynı sistemde oturum açmış bir kişi -32.768 ile 32.767 arasındaki sayıları işleyebilir. Bir işlem, bir int değişkeninin aralığının ötesine geçmesine neden olursa, programcı taşmayı ek kodla işlemek zorundadır.

C veri türleri ve işlemlerindeki bu kısıtlamalar ve sisteme özgü özellikler göz önüne alındığında, C programcıları, programlarının ihtiyaçlarına göre veri türlerini seçmelidir. Seçebilecekleri veri türlerinden bazıları, C programlama dilinde yerleşik olanlar anlamına gelen C'deki ilkel veri türleridir. C'deki veri türlerinin tam listesi ve verilerin bir türden diğerine nasıl dönüştürüleceği hakkında önemli bilgiler için en sevdiğiniz C programlama kılavuzuna bakın.

C programcıları ayrıca, ilkel veri türlerini ve verilerin nasıl düzenlenebileceğini ve işlenebileceğini tanımlayan bir dizi işlevi birleştiren veri yapıları oluşturabilir. Veri yapılarının kullanımı ileri düzey bir programlama konusu olmasına ve bu makalenin kapsamı dışında olmasına rağmen, en yaygın yapılardan birine göz atacağız: diziler. Dizi, tümü aynı veri türü olan veri parçalarını içeren sanal bir listedir. Bir dizinin boyutu değiştirilemez, ancak içeriği diğer daha büyük veya daha küçük dizilere kopyalanabilir.

Programcılar genellikle sayı dizileri kullansalar da, karakter dizileri denilen karakter dizileri en benzersiz özelliklere sahiptir. Bir dize, söyleyebileceğiniz ("merhaba" gibi) bir şeyi, C programınızın kullanıcıdan okuyabileceği veya ekranda yazdırabileceği bir dizi karaktere kaydetmenize olanak tanır. Dize işlemenin benzersiz bir dizi işlemi vardır, tipik dize işlevlerinizle kendi özel C kitaplığına (string.h) sahiptir.

C'deki yerleşik işlemler, çoğu programlama dilinde bulacağınız tipik işlemlerdir. Birkaç işlemi tek bir ifadede birleştirirken, operatör önceliğini veya programın her işlemi matematiksel bir ifadede gerçekleştireceği sırayı bildiğinizden emin olun. Örneğin (2+5)*3 21'e, 2+5*3 ise 17'ye eşittir, çünkü aksini gösteren parantezler olmadıkça C toplamadan önce çarpma işlemi yapacaktır.

C öğreniyorsanız, tüm ilkel veri türlerini ve işlemlerini ve aynı ifadedeki işlemlerin önceliğini öğrenmeyi bir öncelik haline getirin. Ayrıca, farklı veri türlerinin değişkenleri ve sayıları üzerinde farklı işlemlerle denemeler yapın.

Bu noktada, bazı önemli C temellerinin yüzeyini çizdiniz. Şimdi, C'nin her seferinde sıfırdan başlamanıza gerek kalmadan program yazmanızı nasıl sağladığına bakalım.

Sıfırdan Başlamayın, Kitaplıkları Kullanın

Kitaplıklar C'de çok önemlidir çünkü C dili yalnızca ihtiyaç duyduğu en temel özellikleri destekler. Örneğin C, klavyeden okumak ve ekrana yazmak için giriş-çıkış (I/O) işlevlerini içermez. Temel bilgilerin ötesine geçen her şey bir programcı tarafından yazılmalıdır. Kod yığını birden fazla farklı program için faydalıysa, kolayca yeniden kullanılabilir hale getirmek için genellikle bir kitaplığa yerleştirilir.

Şimdiye kadarki C tartışmamızda, standart I/O (stdio) kitaplığı olan bir kitaplık gördük. Programın başındaki #include satırı, C derleyicisine kitaplığı stdio.h adlı başlık dosyasından yüklemesi talimatını verdi. C koruyucuları, G/Ç için standart C kitaplıkları, matematiksel işlevler, zaman işleme ve bir karakter dizisi gibi belirli veri yapılarındaki ortak işlemleri içerir. C89 standart kitaplığı ve C99'daki güncellemeler ve eklemeler hakkında bilgi için Web'de veya en sevdiğiniz C programlama kılavuzunda arama yapın.

Siz de C kitaplıkları yazabilirsiniz. Bunu yaparak, programınızı yeniden kullanılabilir modüllere bölebilirsiniz. Bu modüler yaklaşım, aynı kodu birden çok programa dahil etmeyi kolaylaştırmakla kalmaz, aynı zamanda okunması, test edilmesi ve hatalarının ayıklanması daha kolay olan daha kısa program dosyalarını da sağlar.

Bir başlık dosyasındaki işlevleri kullanmak için programınızın başına bir #include satırı ekleyin. Standart kitaplıklar için, kitaplığın karşılık gelen başlık dosyasının adını büyüktür ve küçüktür işaretleri () arasına koyun. Kendi oluşturduğunuz kitaplıklar için dosyanın adını çift tırnak içine alın. C programınızın diğer bölümlerindeki ifadelerin aksine, her satırın sonuna noktalı virgül koymanız gerekmez. Her bir kitaplık türünden birini içeren aşağıdaki gösteriler:

#Dahil etmek

#include "mylib.h"

Kapsamlı bir C programlama kaynağı, kendi kütüphanelerinizi C'de yazmak için ihtiyacınız olan talimatları sağlamalıdır. Yazacağınız fonksiyon tanımları, ister bir kütüphanede ister ana programınızda olsun, farklı değildir. Aradaki fark, bunları nesne dosyası (.o ile biten bir adla) adı verilen bir şeyde ayrı ayrı derleyeceksiniz ve başlık dosyası (.h ile biten bir adla) adlı ikinci bir dosya oluşturacaksınız. kütüphanedeki her bir fonksiyona karşılık gelen fonksiyon prototipleri. Kitaplığınızı kullanan her ana programda #include satırınızda başvuracağınız başlık dosyasıdır ve bu programı her derlediğinizde nesne dosyasını derleyici komutuna bir argüman olarak eklersiniz.

Şimdiye kadar incelediğimiz C özellikleri, diğer programlama dillerinde de tipiktir. Daha sonra, C'nin bilgisayarınızın belleğini nasıl yönettiğinden bahsedeceğiz.

C'deki İşaretçiler hakkında bazı İşaretçiler

C programınız belleğe (genellikle bilgisayarınızdaki rastgele erişimli bellek veya RAM) yüklendiğinde, programın her bir parçası bellekteki bir adresle ilişkilendirilir. Bu, belirli verileri tutmak için kullandığınız değişkenleri içerir. Programınız bir işlevi her çağırdığında, o işlevi ve ilişkili tüm verilerini, bu işlevi çalıştıracak ve bir değer döndürecek kadar uzun bir süre belleğe yükler. İşleve parametreler iletirseniz, C, işlevde kullanılacak değerin otomatik olarak bir kopyasını oluşturur.

Bazen bir işlevi çalıştırdığınızda, orijinal bellek konumundaki verilerde kalıcı bir değişiklik yapmak istersiniz. C, işlevde kullanmak için verilerin bir kopyasını oluşturursa, orijinal veriler değişmeden kalır. Bu orijinal verileri değiştirmek istiyorsanız, değerini işleve iletmek (değere göre geçmek) yerine bellek adresine bir işaretçi iletmeniz (referansla geçme) gerekir.

İşaretçiler C'nin her yerinde kullanılır, bu nedenle C dilini tam olarak kullanmak istiyorsanız işaretçileri iyi anlamanız gerekir. İşaretçi, diğer değişkenler gibi bir değişkendir, ancak amacı, diğer bazı verilerin bellek adresini depolamaktır. İşaretçinin ayrıca bir veri türü vardır, bu nedenle o bellek adresindeki bitleri nasıl tanıyacağını bilir.

C kodunda iki değişkene yan yana baktığınızda işaretçiyi her zaman tanımayabilirsiniz. Bu, en deneyimli C programcıları için bile zor olabilir. İlk kez bir işaretçi oluşturduğunuzda, bu daha açıktır çünkü değişken adından hemen önce bir yıldız işareti olmalıdır. Bu, C'deki dolaylı operatör olarak bilinir. Aşağıdaki örnek kod, bir i tamsayısı ve bir p tamsayısına yönelik bir işaretçi oluşturur:

int ben;

int *p;

Şu anda i veya p'ye atanmış bir değer yok. Ardından, i'ye bir değer atayalım ve ardından i'nin adresini işaret edecek şekilde p atayalım.

ben = 3;

p = &i;

Burada, "i'nin adresi" anlamına gelen i'den hemen önce adres operatörü olarak kullanılan ve işareti (&) görebilirsiniz. Ödevi yapmak için o adresin ne olduğunu bilmek zorunda değilsin. Bu iyi, çünkü programı her çalıştırdığınızda muhtemelen farklı olacaktır! Bunun yerine, adres operatörü, program çalışırken bu değişkenle ilişkili adresi belirleyecektir. Adres operatörü olmadan, p=i ataması, i değişkeninin bellek adresi yerine tam anlamıyla 3'ün bellek adresini p'ye atar.

Ardından, C kodunda işaretçileri nasıl kullanabileceğinize ve hazırlıklı olmak isteyeceğiniz zorluklara bakalım.

C'de İşaretçileri Doğru Kullanmak

C programlamada yetkin olmak istiyorsanız, kodunuzda işaretçileri nasıl etkili bir şekilde kullanacağınızı sağlam bir şekilde kavramanız gerekir.

Bir işaretçiniz olduğunda, bunu işlemlerde ve işlev çağrılarında aynı veri türündeki bir değişkenin yerine kullanabilirsiniz. Aşağıdaki örnekte, daha büyük bir işlemde i yerine i işaretçisi kullanılmıştır. p (*p) ile birlikte kullanılan yıldız işareti, işlemin, bellek adresinin kendisini değil, o bellek adresine işaret eden p değerini kullanması gerektiğini belirtir:

int b;

b = *p + 2;

İşaretçiler olmadan, C programınızda görevleri main dışında işlevlere bölmek neredeyse imkansızdır. Bunu göstermek için, main'de h adında, kullanıcının boyunu en yakın santimetreye kadar saklayan bir değişken oluşturduğunuzu düşünün. Ayrıca, kullanıcıdan bu yükseklik değerini ayarlamasını isteyen setHeight adlı yazdığınız bir işlevi de çağırırsınız. Ana işlevinizdeki satırlar şöyle görünebilir:

int h;

setYükseklik(h); /* Burada potansiyel bir sorun var. */

Bu işlev çağrısı, h'nin değerini setHeight'a geçirmeye çalışacaktır. Bununla birlikte, işlev çalışmayı bitirdiğinde, işlev yalnızca bir kopyasını kullandığından ve çalışmayı bitirdiğinde attığından, h'nin değeri değişmeyecektir.

h'nin kendisini değiştirmek istiyorsanız, önce işlevin bir değerin yeni bir kopyası yerine mevcut bir değere bir işaretçi alabileceğinden emin olmalısınız. O halde setHeight'ın ilk satırı, parametresi olarak bir değer yerine bir işaretçi kullanır (dolaylama operatörünü not edin):

setHeight(int *height) { /* Fonksiyon ifadeleri buraya gelir */ }

Ardından, setHeight'ı çağırmak için iki seçeneğiniz vardır. Birincisi, geçirilen parametre (&h) olarak h için adres operatörünü kullanmaktır. Diğeri, h için ayrı bir işaretçi oluşturmak ve bunun yerine onu iletmektir. Aşağıdakiler her iki seçeneği de gösterir:

setYükseklik(&h); /* h'nin adresini fonksiyona iletin */

int *p;

p = &h;

setYükseklik(p); /* Fonksiyona h'nin adresine ayrı bir işaretçi ilet */

İkinci seçenek, işaretçileri kullanırken ortak bir zorluğu ortaya çıkarır. Zorluk, aynı değere birden fazla işaretçiye sahip olmaktır. Bu, bir değerdeki herhangi bir değişikliğin tüm işaretçilerini aynı anda etkilediği anlamına gelir. Programınızda neyi başarmaya çalıştığınıza bağlı olarak bu iyi veya kötü bir şey olabilir. Yine, işaretçilerin kullanımında ustalaşmak, C programlamada ustalaşmak için önemli bir anahtardır. Bu zorluklarla yüzleşmeye hazır olmak için mümkün olduğunca işaretçilerle pratik yapın.

Şimdiye kadar incelediğimiz C özellikleri, diğer programlama dillerinde de tipiktir. Daha sonra, dikkatli bellek yönetimi için C'nin taleplerine bakacağız.

C'de Bellek Yönetiminin Önemi

C'yi çok yönlü bir dil yapan şeylerden biri, programcının bir programı çok az miktarda bellekle çalışacak şekilde küçültebilmesidir. C ilk yazıldığında, bu önemli bir özellikti çünkü bilgisayarlar bugün olduğu kadar güçlü değildi. Cep telefonlarından küçük tıbbi cihazlara kadar küçük elektronik cihazlara yönelik mevcut taleple birlikte, bazı yazılımlar için bellek gereksinimlerini küçük tutmaya yönelik yeni bir ilgi var. C, bellek kullanımı üzerinde çok fazla kontrole ihtiyaç duyan çoğu programcı için başvurulacak dildir.

Bellek yönetiminin önemini daha iyi anlamak için bir programın belleği nasıl kullandığını düşünün. Bir programı ilk çalıştırdığınızda, bilgisayarınızın belleğine yüklenir ve bilgisayarın işlemcisinden talimat gönderip alarak çalışmaya başlar. Programın belirli bir işlevi çalıştırması gerektiğinde, bu işlevi çalıştığı süre boyunca belleğin başka bir bölümüne yükler ve işlev tamamlandığında bu belleği terk eder. Ayrıca, ana programda kullanılan her yeni veri parçası, program süresince hafızada yer kaplar.

Tüm bunlar üzerinde daha fazla kontrol istiyorsanız, dinamik depolama tahsisine ihtiyacınız var. C, ihtiyaç duyduğunuz kadar bellek ayırma ve onu kullanmayı bitirir bitirmez bu belleği boşaltma yeteneği olan dinamik depolama ayırmayı destekler. Birçok programlama dilinde, bu bellek yönetimi görevlerini yerine getiren otomatik bellek ayırma ve çöp toplama vardır. Ancak C, standart C kitaplığındaki aşağıdaki anahtar işlevlerle bellek ayırma konusunda açık olmanıza izin verir (ve bazı durumlarda gerektirir):

  • malloc -- Bellek ayırmanın kısaltması olan malloc , programınızın işlemesi gereken belirli bir veri türünü anlatmak için belirli bir boyuttaki bir bellek bloğunu ayırmak için kullanılır. malloc kullandığınızda, ayrılan belleğe bir işaretçi yaratırsınız. Bu, ilk bildirdiğiniz anda (int i'de olduğu gibi) tahsis edilen bir tamsayı gibi tek bir veri parçası için gerekli değildir. Ancak, diziler gibi veri yapılarını oluşturmanın ve yönetmenin önemli bir parçasıdır. C'deki alternatif bellek ayırma seçenekleri, ayrılmış belleği de temizleyen calloc ve daha önce ayrılmış belleği yeniden boyutlandıran realloc'tur .
  • free -- Programınızı belirli bir işaretçiye önceden atanan belleği boşaltmaya zorlamak için free kullanın.

malloc ve free kullanırken en iyi uygulama, ayırdığınız her şeyin serbest bırakılması gerektiğidir. Geçici bir işlevde bile bir şey tahsis ettiğinizde, işletim sistemi alanı temizleyene kadar bellekte kalır. Yine de belleğin boş ve hemen kullanıma hazır olduğundan emin olmak için, mevcut işlev çıkmadan önce belleği boşaltmalısınız. Bu bellek yönetimi, programınızın bellek ayak izini minimumda tutabileceğiniz ve bellek sızıntılarını önleyebileceğiniz anlamına gelir. Bellek sızıntısı, tahsis edilecek bellek kalmayana kadar giderek daha fazla bellek kullanmaya devam ederek programın durmasına veya çökmesine neden olan bir program hatasıdır. Öte yandan, aynı işlevde daha sonra ihtiyaç duyacağınız bir şeyi serbest bırakacağınız ve dolayısıyla kaybedeceğiniz belleği boşaltma konusunda çok endişelenmeyin.

Bu makale boyunca, C programlama dilinin bazı temel yapısını ve temel kavramlarını öğrendiniz. Geçmişine, diğer programlama dilleriyle ortak özelliklerine ve onu kodlama yazılımı için benzersiz ve çok yönlü bir seçenek yapan önemli özelliklere baktık. Sizi C yolculuğunda daha ileriye taşıyacak bazı programlama kılavuzları da dahil olmak üzere daha fazla bilgi için bir sonraki sayfaya geçin.

Daha Fazla Bilgi

İlgili Makaleler

  • C Programlamanın Temelleri
  • Java Nasıl Çalışır?
  • Boole Mantığı Nasıl Çalışır?
  • PERL Nasıl Çalışır?
  • BIOS Nasıl Çalışır?
  • CGI Komut Dosyası Nasıl Çalışır?
  • Bitler ve Baytlar Nasıl Çalışır?

Daha Fazla Harika Bağlantı

  • C Programming.com Eğitimi
  • Vikikitap'ta C Programlama
  • GNU Derleyici Koleksiyonu (GCC)
  • Eclipse Entegre Geliştirme Ortamı Yazılımı

Kaynaklar

  • Kernighan, Brian W. ve Ritchie, Dennis M. "C Programlama Dili, İkinci Baskı." Prentice Salonu. 1988.
  • King, KN "C Programlama: Modern Bir Yaklaşım, İkinci Baskı." WW Norton & Company, Inc. 2008.