Standart C Programlama Dili


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 (&degisken) 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.