3.1.1. &
Ve *
İşleçleri
Zaman zaman, bir değişkenin depolandığı bellek
bölgesinin adresini elde etmek gerekebilir. Bunu yapmak için, adres
alma (&
) işlecini kullanırız. Diğer tekli işleçlerle
aynı önceliğe sahip olan bu tekli işleç,
bellekte belli bir konumda bulunan işlenenlere uygulanabilir. Örneğin, bu
işlenen basit bir değişken (°isken
) veya bir dizi elemanı
(&dizi[indis]
) olabilir. &
işleci
işlenenin adresini (daha doğrusu, işlenen tarafından tutulan belleğin
ilk baytının adresini) verir.
Bunun ne anlama geldiğine bakalım. Her değişken (ana) bellekte bir yerde saklanır. Bilgisayar belleği sınırlıdır; herbiri bir sayı verilerek adreslenen belirli sayıda hücrelerden oluşur. Her hücre belirli bir miktarda bilgi içerir. En küçük bilgi birimi bittir (binary digit—ikili rakam) ve 0/1, doğru/yanlış, açık/kapalı gibi, iki olası değerden bir tanesini saklamaya yarar. Bir bit, rahat olarak işlenmesi için çok küçük bir bilgi birimidir. Bundan dolayı, bitler, genelde 8 bitten oluşan bir bayt veya makineden makineye 8 ile 64 bit arasında değişen sayıda bitten oluşan bir sözcük şeklinde gruplandırılır.
Bizim sistemlerde, bir bayt 8 bit; normal boyda bir tamsayı değişkeni
(32 ve 64 bitlik sistemlerde) 32 bit, yani dört bayt kaplar; bilgisayar belleği
bayt şeklinde adreslenir; arka arkaya gelen baytlar için arka arkaya
gelen adresler kullanılır. Böylece, iki tamsayıdan oluşan bir dizi
(int z[2];
) toplam sekiz bayt kaplar.
Eğer ilk elemanın adresi, örneğin, 140’sa, ikinci elemanınki 144
olacaktır. Adres alma işleci bu sayıları verecektir. Diğer bir değişle,
&z[0]
140
’a eşitse,
&z[1]
de 144
’ye eşittir.
Adres elimizde olduğu zaman, bu sefer o adreste saklanmış olan değeri elde
etmek için bir yönteme gerek duyarız. Bu, temelde &
işlecinin
aksi olan, dolaylama (*
) işleci ile yapılır. Bu
işleç çarpım işleci ile karıştırılmamalıdır, çünkü bu tekli, oysa
çarpım işleci ikili bir işleçtir. Dolaylama işleci diğer tekli
işleçlerle aynı önceliğe sahiptir ve bütün tekli işleçler gibi sağdan sola
birleşir. Bu da, eğer yan yana iki tekli işleç varsa, önce sağdakinin
çalışacağını gösterir. Örneğin, *&x
ile *(&x)
aynı anlama gelir, ve her ikisi de, aşağıda açıklanacağı gibi
x
’e eşdeğerdir.
Dolaylama işleci, işlenen olarak geçerli bir adres bekler ve bu
adreste saklanmış bulunan değeri verir. Ancak bunu yapması için hangi veri
tipinde bilgi vermesi gerektiğini bilmek zorundadır;
int
, double
,
char
yoksa başka bir şey
mi? Bu bilgi işleneninde gizlidir. Örneğin, &x
,
x
değişkeninin tipindeki bir bilgiyi tutan bellek
bölgesinin adresidir (teknik terimi ile, bu adrese bir göstergedir).
Yani, eğer x
bir char
değişkeni ise,
&x
bir char
göstergesidir, böylece *&x
, &x
ile gösterilen bölgede saklanmış bulunan char
değerini
verir.