Temel C Programlama -30- İşaretçilere Giriş

C programlama hakkında şimdiye kadar basit konulardan bahsetsek de artık daha ayrıntılı konulara geçeceğimizi söyleyelim. Dikkat edin, “Zor” demiyorum ayrıntılı diyorum. C dilinin tüm özelliklerine baktığımızda zor bir tarafının olmadığını görürüz. Yalnız oldukça esnek dil olduğu için istersek çok basit programlar yazarız istersek çok karmaşık ve zor programlar yazarız. C dilinin sınırlarını zorlamak zordur fakat özelliklerini basit seviyede kullanmak kolaydır. Kısacası C dilinde ustalaşmanın zor ve zaman alıcı bir süreç olduğunu bilmeniz gerekli.

İşaretçilere Giriş

Bir de C dili derslerini yazarken bir “Merhaba Dünya!” uygulamasını yüzlerce kelimeyle anlattığım, uzattıkça uzattığımı söyleyenler oldu. Fark ederseniz ben burada tık alma niyetiyle basit bir blog yazısı yazmıyorum. Lojikprob’da tüm makaleleri aynı bir kitap yazar gibi yazmaktayım. O halde buraya yazacağıma nedne kitap yazmadığımı sorabilirsiniz. Onu merak edenleri kitaplarla alakalı makalelerimi okumaya davet ediyorum. İsteseydim burada size bedavaya sunduğum makaleleri bir kitap haline getirirdim siz de 70-80 liraya alırsınız!

İşaretçiler konusuna gelirsek bunca yıldır işaretçilerin C dilinin en zor konusu olduğunu söyleyip dururlar. Aslında işaretçilerin kendisinin zor konu olduğunu bütün öğrenciler de eğitmenler de kabul etmektedir. Bunun sebebi çok yüksek seviyede çalışıp, hazır fonksiyon ve program çatıları üzerinde program yazanların alt seviye bir konu ile karşılaşınca işin temelini kavramadığı için çektikleri zorluk olmalıdır. C dili ile siz sistem programcılığı, gömülü sistemler, bilgisayar grafikleri, sürücü yazılımı gibi konularda yazılım yapıyorsunuz. Haliyle işin temelini bilmeniz ve donanıma yakın olmanız gerekli. Alt seviye programcılık ve onunla alakalı konularda donanımı bilmeden bir program yazmanız mümkün değildir.

Bana göre işaretçiler C dilinin en büyük gücünden birisidir. Bu sayede yapabileceklerinizin sınırı kalmamaktadır. Çünkü bütün bellek adreslerine erişebildiğiniz gibi bu adresler üzerindeki değerleri de değiştirebilirsiniz. Elbette kullandığınız işletim sistemleri buna artık izin vermemekte fakat değer bir DOS işletim sistemine sahip bir bilgisayar kullansaydınız isterseniz ekran kartına, ses kartına veya bilgisayarın en kritik adreslerine doğrudan erişiminiz olurdu. Eğer yanlış bir program yazarsanız sistemi bile çökertebilirdiniz.

Günümüzde yüksek seviye programlama dilleri güvenlik endişelerinden dolayı ve çoğu zaman yüksek seviye programcıların gerek duymamasından işaretçilere sahip değildir. Artık yazılımın kütüphanelerden ileri program çatıları (framework) ile geliştirildiği bir dönemde çoğu yazılımcı işaretçileri pek kullanacak olmasa da gömülü sistemlerde C dili kullanılmaktadır ve örnek kodlarda işaretçileri bol bol görmeniz mümkündür.

İşaretçileri anlayabilmek için öncelikle bellek mimarisini ve adres kavramını bilmeniz gerekli. Sitemde elektronik ve bilgisayar bilimleri kategorisinde yazdığım belleklerle alakalı makaleleri okumanız bellek mimarisi konusunda size katkı sağlayacaktır.

İşaretçi Nedir?

İşaretçi (pointer) tam anlamıyla içerisinde bellek adresini bulunduran bir değişken demektir. İşaretçi değişkenin yanı sıra adres erişim operatörü ve değer erişim operatörü olmak üzere iki operatör de bulunmaktadır. Bildiğiniz üzere C dilinde değişkenler bir bellek adresi veya bellek bölümüne verilen adlardan oluşmaktaydı. Diziler de aslında bir bellek adresinden başlayan değişkenler sırasıydı. Normalde değişkenimizin bulunduğu adres 0xFD12 olsa da biz program yazarken buna sayi adını vermekteyiz. Doğrudan bellek adresleri yerine değişken tanımlayıp bunun üzerinde işlem yapmanın kolaylığı aynı internet sitelerine IP adresleri yerine site adlarından erişim sağlamak gibidir. Siz lojikprob.com adresine 86.125.223.61 adresini yazarak gitmek zorunda kalsaydınız ne zor olurdu değil mi? Aynı zamanda değişken tipleri ile de sınırlı olan bellek hücrelerinden bölümler gruplanır ve bu çoklu hücrelere büyük değerler sığdırılır. Normalde bir bellek hücresi 8-bit veri bulundurabilir ve bu da 0-255 değerine denk gelir. Bu kadar küçük bir veriye hücrenin adını yazarak erişmemiz mümkündür. Örneğin 0x50 hücresine eriştiğimiz zaman değeri doğrudan okuyabiliriz.

Büyük verilerde ise çoklu hücreler kullanılmak zorunda kalındığı için erişimde bir sıkıntı yaşanacaktır. Örneğin 16 bitlik bir tam sayı değişkeni 0 ile 65535 arası bir değer alabilir. Bunun için iki adet hücreye ihtiyaç vardır. Bir hücre üst bitleri diğer hücre ise alt bitleri barındırmak zorundadır. Böyle bir sayı için örneğin üst bitte 0x50 adresine alt bitte ise 0x51 adresine erişmek zorundayız. C dili değişken tipleri ile bunu otomatik olarak ayarladığı için bunlara hiç kafa yormamıza gerek yoktur.

Assembly dilindeki gibi doğrudan bellek erişimi yerine C dilinde değişken adları ile bellekte belli hücreleri tanımlar ve onlar üzerinde işlem yaparız. Değişken tanımlarken herhangi bir adres değeri girmeyiz. Derleyici uygun adresi kendisi otomatik olarak verir. Bizim veriye erişimimiz burada sadece değişken adları ile olduğundan arada bir perde söz konusu olmaktadır. Bu da bazen kısıtlayıcı olup bizim yüksek performanslı ve esnek uygulama yapmamızın önüne geçmektedir.

Ayrıca Assembly dilinde olduğu gibi donanımın bütün adreslerine erişme imkanımız olmadığı için özel fonksiyon yazmaçları gibi donanımı kontrol ettiğimiz birimlerin adreslerine işaretçiler olmadan erişemeyiz. Örneğin 0x14 adresindeki bir veriyi değiştirmek istediğimiz zaman yine işaretçilerden faydalanmaktayız.

İşaretçiler bellek adreslerine erişmemizi sağladığı gibi bellek adreslerindeki değerlere de erişmemizi sağlamaktadır. Bu sayede Assembly diline ihtiyaç kalmadan donanım tamamen bizim kontrolümüz altında olabilmektedir.

İşaretçiler olmasaydı C dili yüksek seviye bir dil olarak yüksek seviye dilin getirdiği dezavantajlardan birine sahip olurdu. İşaretçiler olmasaydı C dili günümüzde belki ölü diller arasında yer alırdı. Çünkü C dilinin kendine özel konumunun en önemli etkenlerinden biri işaretçilerdir. Bir sonraki başlıkta işaretçileri uygulamalı olarak sizlere anlatacağız.

Last updated