27 Şubat 2017 Pazartesi

İşaretçi (Pointer) Kavramı


C dili, bir değişkenin adresinin bir başka değişkende saklanmasına izin verir. Bu değişkene işaretçi denir.
İşaretçi denmesinin sebebi ilgili değişkenin adresini işaret etmesinden yani göstermesinden kaynaklanır.
Diğer bir deyişle işaretçi, bir değişkenin adresini içeren başka bir değişkendir.

İşaretçiler, C’nin yönetilmesi en zor yetenekleri arasındadır.
Programların referansa göre çağırma yapmasını sağlarlar.
İşaretçiler sayesinde; Bağlı listeler (Linked List), Sıralar (Queue), Yığınlar (Stack) ve Ağaçlar (Tree) gibi büyüyüp küçülebilen dinamik veri yapılarının oluşturulması ve yönetilmesi sağlanır.


Bir işaretçi, diğer değişkenler gibi, sayısal bir değişkendir.
Bu sebeple kullanılmadan önce program içinde bildirilmelidir. İşaretçi tipindeki değişkenler aşağıdaki gibi tanımlanır:

    tip_adı *isaretci_adı;

Burada tip_adı herhangi bir C veri türü olabilir. Değişkenin önündeki * karakteri yönlendirme (indirection) operatörü olarak adlandırılır ve bu değişkenin veri değil bir adres bilgisi tutacağını işaret eder.



Örnek:
char  *kr;                   /* tek bir karakter için */
int   *x;                          /* bir tamsayı için */
float *deger, sonuc;   /* deger işaretçi tipinde, sonuc sıradan bir gerçel                   değişken */

Yukarıda bildirilen işaretçilerden; kr bir karakterin, x bir tamsayının ve deger bir gerçel sayının bellekte saklı olduğu yerlerin adreslerini tutar.

 int *ptam, tam = 33;
          .
          .
          .
 ptam = &tam;

Bir işaretçiye, bir değişkenin adresini atamak için & (adres) operatörünü kullanırız.
ptam işaretçisi tam değişkeninin saklandığı adresi tutacaktır.


Gösterimde, ptam göstericisinin içeriği tam değişkeninin içeriği (33) değil adresidir (0x3fffd14). Ayrıca, ptam değişkeni, bellekte başka bir hücrede saklandığına ve bu hücrenin int değil int * tipinde bir bölge olduğuna dikkat ediniz.






Örnek: İşaretçi Gösterimi ve Değer Değiştirme 





tam adlı değişkenin içeriğine ptam işaretçisi kullanılarak da erişilebilir.
Bunun için program içinde ptam değişkeninin önüne yönlendirme operatörü (*) koyulmuştur.
Yani *ptam, tam değişkeninin adresini değil içeriğini tutar. Buna göre:

              *ptam = 44;

komutuyla, ptam'ın adresini tuttuğu hücreye 44 değeri atanır.

Özetle
*ptam ve tam, tam adlı değişkenin içeriği ile ilgilidir.
ptam ve &tam, tam adlı değişkenin adresi ile ilgilidir.
* yönlendirme ve & (adres) operatörüdür.



Bellek ve Adresleme


Bilgisayarın ana belleği (RAM) sıralı kaydetme gözlerinden oluşmuştur.
Her göze bir adres atanmıştır.
Bu adreslerin değerleri 0 ila belleğin sahip olduğu üst değere bağlı olarak değişebilir.
Örneğin 1GB bir bellek,
1024*1024*1024 = 1073741824 adet gözden oluşur.

Bir programlama dillinde, belli bir tipte değişken tanımlanıp ve bir değer atandığında, o değişkene dört temel özellik eşlik eder:

değişkenin adı
değişkenin tipi
değişkenin sahip olduğu değer (içerik)
değişkenin bellekteki adresi






Örnek: Bellek ve Adresleme







Atama deyimlerine göre hücrelerin adreslere yerleşimi otomatik olarak gerçekleşir.
yas değişkeni 5400, 5401, 5402, 5403 adreslerini kapsadığından
boy değişkeni 5404 adresinden başlar ve sırasıyla 5405, 5406 ve 5407 adreslerini işgal eder.
kilo değişkeni bu nedenle 5408  adresinden başlar ve 5409, 5410, 5411 adreslerini kapsar.
cins değişkeni ise 5412 adresini tutar.

Örnekte belirtilen kod bloğundaki değişkenler bilgisayar tarafından belirli bir adreste saklanır. Bu yönteme implicit (örtük) adresleme denir.
İşaretçi değişken kullanılarak, işaretçilere verilerin bellekte saklandığı bellek hücrelerinin başlangıç adresleri atanır. Bu yönteme ise explicit (açık) adresleme denir.


Örnek:
    int tam = 33;

Bu değişken için, int tipinde bellekte (genellikle herbiri 1 bayt olan 4 bayt büyüklüğünde) bir hücre ayrılır ve o hücreye 33 sayısı ikilik (binary) sayı sitemindeki karşılığı olan 4 baytlık (32 bitlik) karşılığı aşağıdaki gibi yazılır.
    00000000 00000000 00000000 00100001


Örnek:
    int tam = 33;




Bellek adresleri genellikle onaltılık (hexadecimal) sayı sisteminde ifade edilir.
0x3fffd14 sayısı onluk (decimal) sayı sisteminde 67108116 sayına karşılık gelir. Bunun anlamı, tam değişkeni, program çalıştığı sürece, bellekte 67108116. - 67108120. numaralı gözler arasındaki 4 baytlık hücreyi işgal edecek olmasıdır.







tam adlı değişkenin bellekteki gerçek konumu ve ikilik düzendeki içeriği aşağıdaki gibidir:







Değişkenin saklı olduğu adres, & karakteri ile tanımlı adres operatörü ile öğrenilebilir.
Bu operatör bir değişkenin önüne konursa, o değişkenin içeriği ile değil adresi ile ilgileniliyor anlamına gelir.








Birlikler (Union)


Birlikler de yapılar gibi sürekli belleğe yerleşen nesnelerdir.
Birlikler yapılara göre daha az kullanılırlar. Bir programda veya fonksiyonda değişkenlerin aynı bellek alanını paylaşması için ortaklık bildirimi union deyimi ile yapılır. Bu yer, birliğin en büyük alanı kadardır.
Bu da belleğin daha verimli kullanılmasına imkan verir.
Bu tipte bildirim yapılırken struct yerine union yazılır.


Örnek:

union test
{
      int x;
      char y[10];
} p

Bu tanıma göre x tamsayısı için bellekte 4 baytlık yer ayrılmaktadır.
Birlik içinde yer alan y değişkeni için 10 baytlık yer ayrılmıştır.
Bu durumda, birlik için en fazla 10 baytlık bir yer ayrılmıştır. Ayrılan bu alan, birliğin her bir alanı tarafından ortak kullanılır.

typedef Kullanımı

typedef deyimi C dilinde değişken tanımlama yaparken kullanılan int, float, char gibi değişken isimlerini değiştirmeye yarar.
Bu sayede kodlar programcının anadiline daha fazla yaklaşmış olur.
struct deyimi ile beraber kullanıldığında oluşturduğunuz yapıyı bir değişken türü olarak tanımlayıp o yapının çoğaltılmasını sağlar. Bu yapıdan değişken tanımlamak için tekrar struct deyiminin kullanılmasına gerek kalmaz.


Örnek: typedef Kullanımı

struct içerisinde struct Kullanımı

C programlama dili struct içerisindeki bir üyenin yine bir struct olmasına izin verir. Bunu yapmaktaki temel amaç:
Kaynak kodun tekrar kullanılabilirliğini arttırmak
Kaynak kodun okunabilirliğini arttırmak
Kaynak kodu sadeleştirmek

Örnek: struct içerisinde struct Kullanımı


struct (Yapı) Deyimi





Yapılar, farklı veri türlerine sahip değişkenlerin bir grup olarak değerlendirilmesi ve bu grubun bir isimle kullanılması amacıyla tercih edilen kullanıcı tanımlı bir veri türüdür.
Yapılar diziler gibi bellekte sürekli kalır.
Bir yapı içerisindeki elemanlara üye (member) denir.
Üyelerin her biri farklı veri tipine sahip olabilir.
Yapılar sayesinde kendi veri tipinizi üretmeniz mümkündür.
Yapılar farklı programlama dillerinde Record (Kayıt) olarak da geçerler.

Yapılar int, float, char gibi farklı tipteki değişkenleri veya aynı türdeki birden çok değişkeni bir araya getirmeyi sağlar. Nesne tabanlı programlamanın da temelini oluşturan bu oluşumu iyi öğrenmek, ileriki zamanlarda C# ve JAVA gibi tamamen nesneye dayalı programlamayı benimsemiş gelişmiş dilleri öğrenmeye de yardımcı olacaktır.


Yapı gösterimi aşağıdaki gibidir:

struct yapı_adı{
    veri_tipi yapı_değişken_ismi;
     veri_tipi yapı_değişken_ismi;
         ...
       };

Örnek: Bir üniversitedeki öğrencilerin bilgilerini struct kullanarak ifade edelim.
Kullanılacak bilgiler aşağıdaki gibi olsun:
Öğrenci Numarası
Öğrenci Adı
Öğrenci Soyadı
Öğrenci Cinsiyeti
Öğrenci Fakültesi/Bölümü
Öğrenci  Genel Not Ortalaması






Örnek: struct Okuma ve Yazma







struct Değişkenlerini Kopyalama

struct tipindeki bir değişkenin değeri aynı tipteki bir başka struct değişkenine atanabilir.
Atama aşağıdaki şekilde yapılır:

    degisken1 = degisken2;

Örnek: struct Kopyalama





struct Değişkenlerini Karşılaştırma




struct tipindeki bir değişken aynı tipteki bir başka struct değişkeni ile direk karşılaştırılamaz. Ancak sahip olduğu üyelerinin tamamı diğeri ile karşılaştırılır.
Aşağıdaki karşılaştırma yanlıştır:

    if (degisken1 == degisken2) ….

Örnek: struct Değişkenlerini Karşılaştırma

Genellikle yapı değişkeni veya nesne karşılaştırmalarında tek tek üyeleri veya özellikleri karşılaştırmaya gerek yoktur. Çünkü o değişkeni diğer değişkenlerden ayırt edecek benzersiz bir üye mutlaka bulunmaktadır. 





struct Değişkenleri ve Fonksiyonlar

struct tipindeki bir değişken herhangi bir fonksiyona parametre olarak aktarılabilir.
Herhangi bir fonksiyon geri dönüş değeri olarak struct tipinde bir veri türü geriye dönebilir.

Örnek: struct ve Fonksiyonlar









struct Değişkenleri ve Diziler

struct tipi içerisinde dizi türünde üyeler tanımlamak mümkündür.
Dizileri struct tipinde tanımlamak mümkündür.

Örnek: struct Değişkenleri ve Diziler









Örnek: struct Değişkenleri ve Diziler






Yapılar ve Birlikler (enum Deyimi)


enum Deyimi / Sayma Sabitleri (Enumeration Constants)
struct Deyimi / Yapı (Structures)
typedef Deyimi
union Deyimi / Birlik


enum Deyimi

Sayma tipi olarak adlandırılırlar.
Bir sayma tipi, enum anahtar kelimesiyle tanıtılır ve tanıtıcılar ile temsil edilen tamsayı sabitlerinin kümesidir.
Bu sayma sabitleri, değerleri otomatik olarak belirlenen sembolik sabitlerdir.
enum içindeki değerler aksi belirtilmedikçe 0 ile başlar ve 1 arttırılır.
Bu tip, değişkenin alabileceği değerlerin sabit olduğu durumlarda programı daha okunabilir hale getirmek için kullanılır.


Mantıksal örnekler:
Cinsiyet: Kadın, Erkek
Calisma_Durumu: İssiz, Calisan, Ögrenci, Emekli
Evlilik_Durumu: Evli, Bekar
Egitim_Durumu: İlkokul, Lise, OnLisans, Lisans, LisansUstu

Genel yazım biçimi:
enum tip_adı{değer_1, değer_2, ..., değer_n} değişken_adı;


Örnek:
       enum bolumler {programcilik, donanim, muhasebe, motor};

Tanımı ile derleyici
programcilik için 0,
donanim için 1,
muhasebe için 2 ve
motor için 3 değerini
kabul ederek atamaları buna göre yapar.








Alıştırma: enum Oluşturma

Aşağıdaki bilgileirn enum tiplerini oluşturunuz:
Cinsiyet: Kadın, Erkek
Calisma_Durumu: İssiz, Calisan, Ögrenci, Emekli
Evlilik_Durumu: Evli, Bekar
Egitim_Durumu: İlkokul, Lise, OnLisans, Lisans, LisansUstu

HTML-5 ile ilgili yardımcı web adresleri

http://openhtml5games.com/
http://www.html5quintus.com/
http://codecanyon.net/category/html5/games
http://blog.lessmilk.com/how-to-make-flappy-bird-in-html5-1/
http://www.html5gamedevelopment.com/html5-game-tutorials
http://www.playmycode.com/
http://cssdeck.com/labs/classic-snake-game-with-html5-canvas