İçeriğe geç

C Programlama Bellek ve Adresleme

İşaretçilere Giriş:

  • 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 ile belleğin sahip olduğu üst değere bağlı olarak değişebilir.
  • 1 GB bellek,

1024*1024*1024=1073741824 adet gözden oluşur.

 Bir programlama dilinde, 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:

  1. Değişkenin adı
  2. Değişkenin tipi
  3. Değişkenin sahip olduğu değer (içerik)
  4. Değişkenin bellekteki adresi

Değişken türlerinin bellekte kapladığı alanlar:

byt

Bellek adreslerinin nasıl olduğunu yapıldığını inceleyelim:

Yani değişkenin baytı kadar kadar kayar. yas’ın veri tipi int, boy ve kilonun float ve cins veri tipi char ‘dır.

Bu değişkenlerden yas değişkeni 5400,5401,5402,5403 adreslerini kapsar. Aynı sekilde boy ve kilo değişkenleri de bir sonrakinin adresine kadar kapsar. cins değişkeni sadece bulunduğu 5412 adresini tutar.

  • 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.

Yukarıdaki örnekte gördüğümüz gibi adres göstermek için “%p “ operatörünü kullanılırız.

İş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.
  • 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.

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. Sonuç burada pointer değildir. Her zaman tanımladığımız float tipinde bir değişkendir.

Bir işaretçiye, bir değişkenin adresini atamak için & (adres) operatörünü kullanırız.

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

Ptam işaretçisine yeni bir değer atayacak olursak. Örneğin *ptam= 44;  sayı değeri atadığımız için başına ( * ) operatörü koymamız gereklidir. ptam’ın yeni sayı değeri 44 olmuştur ancak adresi değişmemiştir. Yani 33 sayısının adresine 44 sayısını yazmıştır.

İşaretçi Aritmetiği

İşaretçiler kullanılırken, bazen işaretçinin gösterdiği adres taban alınıp, o adresten önceki veya sonraki adreslere erişilmesi istenebilir.Bu durum, işaretçiler üzerinde, aritmetik işlemcilerin kullanılmasını gerektirir.

İşaretçiler üzerinde yalnızca

  • toplama (+),
  • çıkarma (-),
  • bir arttırma (++) ,
  • bir eksiltme (–)

operatörleri işlemleri yapılabilir

Gerçekte, işaretçiye bir eklemek, işaretçinin gösterdiği yerdeki veriden hemen sonraki verinin adresini hesaplamaktır.

  • char *kar;     —–> 10000 (0x2710)
  • int *tam;       —–> 20000 (0x4e20)
  • double *ger; —–> 30000 (0x7530)

Buna göre atama işlemlerinin sonucu:

  • kar++; —–> 10001 (0x2711)
  • tam++; —–> 20004 (0x4e24)
  • ger++; —–> 30008 (0x7538)

Buna göre aşağıdaki atamalar şöyle yorumlanır:

  • kar++;    /* kar = kar + sizeof(char)*/
  • tam = tam + 5; /* tam = tam + 5*sizeof(int)*/
  • ger = ger – 3;   /*ger = ger – 3*sizeof(double)*/
Tarih:Yazılım/Teknoloji

İlk Yorumu Siz Yapın

    Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir