11.1 Değişken ve Bellek Adresi(Gösterici-Pointer-İşaretçi-Göseterge)
pointer = işaretçi = gösterici = gösterge
Anlatımda, gösterici terimini kullanacağız.
11.1 Değişken ve Bellek Adresi
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 ila belleğin sahip olduğu üst değere bağlı olarak değişebilir. Örneğin 1GB MB bir bellek, 1024*1024*1024 = 1073741824 adet gözden oluşur. Değişken tiplerinin bellekte işgal ettiği alanın bayt cinsinden uzunluğu sizeof() operatörüyle öğrenildiğini hatırlayın. (bkz: Program 2.1).
Bir programlama dillinde, 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:
- değişkenin adı
- değişkenin tipi
- değişkenin sahip olduğu değer (içerik)
- değişkenin bellekteki adresi
Örneğin tam adlı bir tamsayı değişkenini aşağıdaki gibi tanımladığımızı varsayalım:
1 |
int tam = 33; |
Bu değişken için, int tipinde bellekte (genellikle herbiri 1 bayt olan 4 bayt büyüklüğünde) bir hücre ayrılır ve o hücreye 33 sayısı ikilik (binary) sayı sitemindeki karşılığı olan 4 baytlık (32 bitlik):
00000000 00000000 00000000 00100001
sayısı elektronik olarak yazılır. tam değişkenine ait dört temel özellik Şekil 11.1’deki gibi gösterilebilir:
Şekil 11.1: Bir değişkene eşlik eden dört temel özellik
Bellek adresleri genellikle onaltılık (hexadecimal) sayı sisteminde ifade edilir. 0x3fffd14 sayısı onluk (decimal) sayı sisteminde 67108116 sayına karşık gelir. Bunun anlamı, tamdeğişkeni, program çalıştığı sürece, bellekte 67108116. – 67108120. numaralı gözler arasındaki 4 baytlık hücreyi işgal edecek olmasıdır. Şekil 11.1’deki gösterim, basit ama anlaşılır bir tasvirdir. Gerçekte, int tipindeki tam değişkeninin bellekteki yerleşimi ve içeriği (değeri) Şekil 11.2’de gösterildiği gibi olacaktır.
Şekil 11.2: tam adlı değişkenin bellekteki gerçek konumu ve ikilik düzendeki içeriği
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. Aşağıdaki program parçasının:
1 2 3 4 |
int tam = 33; printf("icerik: %d\n",tam); printf("adres : %p\n",&tam); |
çıktısı:
1 2 |
icerik: 33 adres : 3fffd14 |
şeklindedir. Burada birinci satır tam değişkeninin içeriği, ikinci ise adresidir. Adres yazdırılırken %p tip belirleyicisinin kullanıldığına dikkat ediniz.