İçeriğe geç

C Programlama Bellek ve Adresleme-2

İşaretçiler ve Diziler

Diziler ve işaretçiler, C’de özel bir biçimde ilişkilidirler. Birbirleri yerine hemen hemen her yerde kullanılabilirler. Bir dizi ismi, sabit bir işaretçi olarak düşünülebilir. Bu yüzden, bir dizinin herhangi bir elemanına işaretçi ile de erişilebilir.

işaretçiler

Not: Dizilerde aslında birer işaretçidir. Bunun için doğrudan aynı tipteki bir işaretçiye atanabilirler.

Ayrıca, i bir tamsayı olmak üzere aşağıdaki iki ifade aynı anlamdadır.

  •  kutle[i];
  • *(p + i);

Bunun sebebi, p işaretçisi kutle dizisinin başlangıç adresini tutmuş olmasıdır. p+i işlemi ile i+1. elemanın adresi, ve *(p+i) ile de bu adresteki değer hesaplanır. *(p+i); —-> p nin gösterdiği adresten i blok ötedeki sayıyı hesapla

Örnek: *(p+3);

  • Bu deyimde 3, işaretçinin offsetidir.
  • İşaretçi, dizinin başlangıç adresini gösterirken, ve offset değeri dizi belirteciyle eştir. offset dizinin hangi elemanının kullanılacağını belirtir
  • Bu gösterime işaretçi/offset gösterimi denir.
  • Parantezler gereklidir çünkü * operatörünün önceliği + operatörünün önceliğinden yüksektir.
  • Parantezler olmadan yukarıdaki ifade, *p’ye 3 eklerdi. (yani, p’nin dizinin başlangıcını gösterdiği düşünülürse, kutle[0]’a 3 eklenirdi.)

Fonksiyon Parametresi Olan İşaretçiler:

C programlama dilinde fonksiyon parametreleri

  • Değer geçerek (pass by value)
  • Adres geçerek (pass by reference) olarak geçilebilirler.

Şu ana kadar gördüğümüz fonksiyon kullanımında geçirilen parametreler, fonksiyon içerisinde değiştirilse bile, fonksiyon çağırıldıktan sonra bu değişim çağrılan yerdeki değerini değiştirmez.

Fakat, bir parametre adres geçerek aktarılırsa, fonksiyon içindeki değişiklikler geçilen parametreyi etkiler.

  • Adres geçerek aktarım, işaretçi kullanmayı zorunlu kılar.

 İşaretçiler Kullanılarak Takas (Swap)

İşaretçi kullanılarak “pass by reference” ile parametre aktarmayı en iyi anlatan örneklerden birisi de swap işlemidir.  Swap iki değişkenin değerlerinin yer değiştirmesi anlamına gelmektedir.

  • Basit bir takas örneği yazalım:

temp geçici a değerini tutan bir değişkendir. a değerine b değeri atandıktan sonra b değerine de önceden a değeri atanmış olan temp değişkeni atanır. Böylece a ve b nin değeri birbirleriyle değiştirilmiş olur.

Fonksiyon Geri Dönüş Değeri Olan İşaretçiler

Fonkiyonların geri dönüş değeri bir işaretçi olabilir.

  • Bu durumda, fonksiyon bir değer değil adres döndürecek demektir.
  • Prototip aşağıdaki gibidir:

int *Fonksiyon(int a)

Struct ve İşaretçiler

Struct içerisindeki üye elemanları bir işaretçi olabileceği gibi struct değişkenlerinin kendisi de bir işaretçi olabilir.  Kisi bir struct olmak üzere aşağıdaki gibi bir işaretçi tanımlanabilir ve üyelerine -> karakterleri ile ulaşılabilir.

Fonksiyon İşaretçileri

Fonksiyon işaretçileri, işaretçi (pointer) kavramının gücünü gösteren diğer bir uygulama alanıdır. • Dizilerde olduğu gibi, fonksiyon adları da sabit işaretçidir.

  • Fonksiyon kodlarının bellekte bir adreste tutulduğu şeklinde düşünebiliriz.
  • Fonksiyon işaretçisi basit olarak fonksiyon adının saklandığı bellek adresini tutan bir işaretçidir.
  • Fonksiyon işaretçileri sayesinde, fonksiyonlar başka fonksiyonlara parametre olarak aktarılabilmektedirler.

void Tipindeki İşaretçiler

  • void işaretçiler herhangi bir veri tipine ait olmayan işaretçilerdir.
  • Bu özelliğinden dolayı, void işaretçi genel işaretçi (generic pointer) olarak da adlandırılır.
  • void göstericiler, void anahtar sözcüğü ile bildirilir.

Örnek: void *adr;

 

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