6 Mart 2017 Pazartesi

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


int kutle[5], *p, *q;

p = kutle; -------------> 1. Elemanın adresi p işaretçisine atanıyor


p = &kutle[0];--------> 1. Elemanın adresi p işaretçisine atanıyor


q = &kutle[4];----------> 5. Elemanın adresi p işaretçisine atanıyor

Not: Dizi adı bir işaretçi olduğu için doğrudan aynı tipteki bir işaretçiye atanabilir.


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