Zamanınız sınırlı, başkalarının hayatını yaşayarak bunu ziyan etmeyin.

7 Temmuz 2014 Pazartesi

Pointers(İşaretçiler)

·         C programlama dilinin günümüze kadar başarılı bir şekilde gelmiş olmasının en büyük nedenlerinden biriside işaretçilerdir.
·         C dili üst seviye bir programlama dili olmasına rağmen işaretçiler sayesinde alt seviye programlama diline de hafiften giriş yaparlar.
·         Genelde üst seviye programlama dilleri hafızaya insan erişimini zorlaştırır.Ama c dilinde hafızaya erişim olabildiğince basittir.
·         Bu özellikler acemiler için bir eksi unsurdur.Çünkü hafızanın alakasız bölümlerine erişmesi,değerlerle oynaması tüm sistemin yok olmasına neden olabilir.
·         İşaretlerin amacı, sistemin daha hızlı ve daha verimli çalışmasını sağlamaktır.
·         Arkadaşlar örneğin int sayi; şeklinde bir tamsayı değişkeni olarak sayıyı tanımlamadık.Bellek buna 0x17RRGG adresinki değerin karşılığını verir.Yani sayı değeri artık o bellek adresindeki değerdir.Daha sonra sayi=61; yaparsak artık o bellek adresindeki değer kaybolup 15 değeri sayı değişkenine atanmıştır.
·         İşaretler şu ana kadar yaptığımız gibi doğrudan değil de dolaylı olarak değerlere erişimimizi sağlar.
·         İşaretçi Değişkenlerinin Deklerasyonu :

·         Fazla sözel olarak anlatma yapmayıp kodlar üzerinde anlatma yapacağım arkadaşlar.


·         Şimdi bir örnek programla işaretçilerin nasıl kullanıldığını,adres operatörünü ve erişim operatörü olan * kullanımını kavramaya çalışalım.


·         NULL Pointer (Boş İşaretçi) :
·         Değeri NULL olan bir işaretçi üzerinde referanstan kurtarma işlemi yapılamaz.Peki referanstan kurtarma nedir?
·         Referanstan kurtarma,erişim operatörü sayesinde (*) işaretçinin bellek adresini kullanarak bir başka değişkenin değerine ulaşmaya denir.
·         Eğer işaretçiye herhangi bir adres değeri tanımlamıyorsak,NULL değeri atamak çok mantıklı olur.Çünkü adres değeri vermeden işaretçiye ulaşmak istersek çok alakasız değerlerle karşılaşabiliriz.
·         Kullanılmayan İşaretçilerin NULL Değeriyle Sonlandırılması :
·         Bir program yazarken işaretçilerden biri ile işiniz bittiği zaman ona NULL değerini atamak her zaman daha mantıklı olur.Çünkü daha sonradan yapacağınız yanlış atamalarla programınızda hatalara  sebep olabilirsiniz.Bunun sonucundada yanlış bellek adreslerine ulaşım sizin için çok sorun teşkil edebilir.

·         Şimdi bir örneğimizle yanlış bir kullanımı sizlere göstereyim.



·         Erişim Ve Adres Operatörlerinin Kullanımları :
·         Şimdi arkadaşlar bir örnek ile bu konuyu anlatmaya çalışacağım.


·         Arkadaşlar bir kitapta okuduğum bir metin ile bu konuyu kısaca anlatayım.
·         Bir insanla konuşmak için iki yöntemimiz var diyelim.Birisi yüzyüze konuşmak diğeri ise telefonla konuşmak.Siz yüzyüze konuştuğunuz zaman direktmen sayı değişkenine ulaşarak yani kişiye ulaşarak yaparsınız.İşaretçilere de telefon numaraları diyebiliriz.Biz bu numaralar sayesinde değişkenlerimize yani konuşmak istediğimiz kişilere ulaşırız.Bunlarıda adres operatörü sayesinde kaydeder Erişim operatörü sayesinde erişim yaparak yaparız.Tevfik Kızılören’e aittir.


·         Değişken Değerinin İşaretçiler Aracılığıyla Değiştirilmesi :

·         Arkadaşlar kodlar üzerinden anlatmaya çalışacağım.Bildiğiniz gibi ezber yok mantık var.


·         İşaretçilerin Neden Tek Bir Veri Tipinden Oluşmadığının Sebebi :
·         Arkadaşlar bu soru aslında çok kolay.Her bir değişken tipi bellekte ayrı yer kaplar.Örneğin int veri tipi 4 bayt kaplarken,char veri tipi 1,double veri tipi ise 8 bayt kaplar.İşaretçilerin arttırma ve eksiltme operatörlerine vereceği tepkiler farklıdır ve bu yüzden verimlilik oluşması için hangi veri tipinden işaretçiyi kullanmamızı bilmemiz gerekir.
·         Şimdi bir örneğimizle konuyu kavramaya çalışalım.


·         Dizilerin İşaretçiler Aracılığıyla Yönetimi :
·         İşaretçiler bizim dizi ve benzeri veri yapılarını daha verimli bir şekilde yönetmemizi sağlar.
·         Bir işaretçiye dizinin ilk elemanını kopyalarsak diğer bütün elemanlara kolayca erişebiliriz.
·         Şimdi bir örneğimizle konuyu kavramaya çalışalım.


·         İşaretçiler Üzerinde yapılan işlemler :
·         Arkadaşlar iki işaretçi toplanamaz veya çarpılamaz.Bu kısıtlamanın sebebi şudur:
·         Bir önceki bölümde işaretçilerin bellek adreslerini telefon numaralarına benzetmiştik.Peki iki telefon numarasını toplamak ya da çapmak bizim bir işimize yarar mı ?Tam olarak doğru olmasada mantığını buna benzetebiliriz arkadaşlar.
·         İşaretçiler arasında çıkarma işlemleri yapılabilir.

·         Şimdi bir örneğimizle konuyu kavramaya çalışalım.


·         İşaretçiler Üzerinde Artırma Ve Eksiltme Operatörlerinin Kullanılması :
·         Arkadaşlar direktmen örnek üzerinden anlatmaya çalışacağım.Buyrun örneğimizi inceleyelim.


·         İşaretçilerin Karşılaştırılması :
·         İki işaretçi değeri birbirine eşitse her ikisi de aynı bellek alanındaki değeri tutar.
·         Bir işaretçinin değeri diğerinden düşükse bu o işaretçinin bellek alanındaki değerinin daha küçük olduğunu söyler.
·         Bir dizinin ilk elemanının tuttuğu bellek adresi son elemanın tuttuğu bellek adresinden her zaman küçüktür.
·         Şimdi bir örneğimizle konuyu kavramaya çalışalım.


·         İşaretçileri Fonksiyonlara Parametre Olarak Göndermek :
·         Arkadaşlar bu konuyu da örnek üzerinde açıklamalar yaparak anlatacağım.

·         Swap(Yer Değiştirme) İşleminde İşaretçiler :
·         Arkadaşlar dizilerde sıralama konusunu işlerken swap işleminin göstermiştim.Şimdi işaretçiler aracılığı ile bunu yapacağız.


·         İşaretçiler İle Ortalama Bulma Programı :

·         Karakter Dizilerinin İşaretçiler İle Yönetilmesi :
·         Arkadaşlar bildiğiniz gibi karakter dizilerinin normal dizilerden son elemanı olan NULL karakteri dışında bir farkı yoktur.Daha öncesinde yazdığımız kendi karakter dizisi fonksiyonlarımızdan bir örnek göstereceğim.
·         Bu sefer yapacağımız şey dizinin başlangıç adresini tutmak olacak.

·         Şimdi bir örneğimizle konuyu kavramaya çalışalım.


·          Void İşaretçiler :
·         Bu işaretçi türleri değişkenlerin tiplerine bağlı olmaksızın o değişkenlerin bellek adreslerini tutabilirler.
·         Şimdi bir örneğimizle konuyu kavramaya çalışalım.


·         const Anahtar Kelimesinin İşaretçilerle Kullanımı :
·         Arkadaşlar eğer bir değişken const ifadesi ile yani değeri sabit olarak tanımlanmışsa onun bellek adresine ulaşacak olan pointer da sabit olmalıdır.
·         Örnek kullanım şudur :
·         const int sabitSayi=61; const int*pointer=&sabitSayi;
·         Yukarıdaki kullanım haricinde kullanım olursa programımız hata verecektir.
·         Fonksiyon İşaretçileri :
·         Daha önceki derslerimizde fonksiyonlara parametre olarak işaretçi göndermiştik.Şimdi yapacağımız şey fonksiyonun bellek adresinin işaretçiye kopyalayıp işlemimizi işaretçi üzerinden tamamlamak olacak.
·         Şimdi bir örneğimizle konuyu kavramaya çalışalım.


·         Fonksiyon İşaretçilerini Başka Fonksiyonlara Parametre Olarak Göndermek :
 Arkadaşlar bu konuyu bir örnekle anlatacağım.Bu konu çok önemli.İyice konuyu anlamaya çalışın. 

·         Değişken Sayısında Parametre Alan Fonksiyonlar :
·         Arkadaşlar daha öncesinde fonksiyonlara parametre gönderirken parametreleri kendimiz belirliyorduk.Şimdi ise değişken sayısınca parametre belirleyebileceğiz.Bunları istediğimiz sayıda yapabiliriz.
·         Bunu yapmamız için programımıza stdarg.h kütüphanesini eklememiz gerekir.Örnek bir kullanım göstereyim hemen.
·         int carp(int parametreSayisi, …) . Bu ifade sayesinde parametrelerimizi istediğimiz sayıda kullanabiliriz.Bunla beraber stdarg.h kütüphanesi bizim karşımıza 4 tane anahtar kelime çıkartacaktır.Şimdi bunları inceleyelim.
·         stdarg.h Kütüphanesi Anahtar Kelimeler:
·         va_list Anahtar Kelimesi :
·         Bu anahtar kelime değişken sayısı kadar fonksiyon parametrelerini  barındıran bir listeye erişim imkanı sunan bir işaretçi tanımlamamızı sağlar.Örnek = va_list parametrePointer; şeklindedir.
·         va_start Anahtar Kelimesi :
·         Bu anahtar kelime fonksiyon parametrelerini gezme işlemini yapar.Her zaman 2 tane argüman kullanır.Bunlar fonksiyon parametrelerini barındıran listeyen erişme imkanı sağlayan işaretçi ile parametre sayısıdır.Örneğin = va_start(parametrePointer,parametreSayisi) ; şeklindedir.
·         va_arg Anahtar Kelimesi :
·         Bu anahtar kelime parametrelerden belirli bir tipte parametre okunmasını sağlar.Bu fonksiyon her çağrılışında farklı bir farklı bir tip değeri okuyabilir.Bundan dolayı bu tipi biz belirtmeliyiz.
·         Örnek ; geciciDegisken = va_arg(parametreSayisi,int) ; şeklindedir.
·         va_end Anahtar Kelimesi :
·         Bu anahtar kelime parametrePointer ile listeye erişim işimiz bittiğinde bu pointerın içeriği temizleyerek bellekte eski haline getirir.
·         Şimdi bu anahtar kelimelerle yazılmış bir programımızla konuyu kavramaya çalışalım.

·         ourPrintf Fonksiyonu :
·         Arkadaşlar şimdi kendi printf fonksiyonumuzu yazalım .



Hiç yorum yok:

Yorum Gönder