Trendy
11.04.2006, 11:27
Adres Sabitleri
Adresler tamsayı görünümünde olsalar da tamsayı sabitleri gibi belirtilmezler. Çünkü tür bilgilerinin de belirtilmesi gerekir. Adres sabitleri, tamsayı türlerindeki sabitler üzerinde bilinçli tür dönüşümü yapılarak elde edilirler. Bir tamsayı sabitini adres türüne çevirmek için tür dönüştürme operatörü kullanılır.
(<tür> *) <tamsayı sabiti>
Tür dönüştürme operatörünün içindeki * adres ya da göstericiyi temsil etmektedir. Örneğin
0x1F00
hexadesimal olarak gösterilmiş int türden bir sabittir. Ancak:
(int *) 0x1F00
int türünden bir adres sabitidir.
0x16C0L
long türden bir tamsayı sabittir. Ancak:
(long *) 0x16C0L
long türden bir adres sabitidir. Bunun anlamı şudur: Derleyici 16C0 adresiyle belirtilen yerdeki bilgiyi long olarak yorumlayacaktır.
Adres türüne bilinçli dönüşüm yalnız sabitlerle yapılmayabilir, örneğin:
(char *) var
var isimli değişken hangi türden olursa olsun, yukarıdaki ifade ile char türden bir adres haline dönüştürülmüştür.
Bir adres bilgisini bir nesne içinde tutmak isteyelim. (Şu an için neden böyle bir şey isteyebileceğimiz sorusu akla gelebilir, ama ileride bunun çok doğal ve gerekli bir işlem olduğunu göreceğiz.) Bu işi nasıl gerçekleştireceğiz? İlk olarak aklımıza şu gelebilir: int türden bir nesne tanımlayalım ve adresin sayısal bileşenini tanımladığımız int türden nesne içinde tutalım. Yani adresin sayısal bileşeni olan tamsayıyı int türden bir nesneye atayalım. Bu durumda iki önemli sakınca ortaya çıkacaktır:
Söz konusu int nesnenin değerine programın herhangi bir yerinde tekrar ulaştığımızda, bunun bir adres bilgisinin (yani iki bileşenli bir bilginin) sayısal bileşeni mi yoksa int türden normal bir değer mi olarak yorumlanacağını nereden bileceğiz? Peki örneğin değişkenin isminden, değerinin bir adres bilgisinin sayısal bileşeni olduğu sonucunu çıkardığımızı düşünelim, bu durumda adresin tür bileşeninin ne olduğunu nereden anlayacağız?
O zaman belki de şu önerilecektir: int türden bir adres bilgisini int türden bir nesnede, char türden bir adres bilgisini char türden bir nesnede, double türden bir adres bilgisini ise double türden bir nesnede saklayalım, vs. Ama örneğin 64K'lık bir adres alanının söz konusu olduğunu düşünelim. toplam 65535 byte söz konusu olabileceğine göre bize 2byte uzunluğunda bir nesne gerekecek. Örneğin 1 byte uzunlukta bir nesne içinde ancak ilk 255 byte'a ilişkin sayısal bileşenleri tutarken, 8 byte uzunluğunda bir nesne içinde de gerekmediği halde çok büyük bir alana ilişkin adres bilgisini tutabiliriz.
int sabitleri int türden değişkenlere, gerçek sayı sabitleri gerçek sayı türünden değişkenlere doğal olarak atanıyorlar. Yani her sabit türünün doğal olarak atanabileceği türden bir değişken tanımlayabiliyoruz. İşte adres de ayrı bir tür olduğuna göre adres türünün de doğal olarak atanabileceği değişkenler tanımlanabilir. Bu değişkenlere (nesnelere) gösterici (pointer) denir.
‘a’ /* char türden bir sabittir */
char a; /* a char türden bir değişkendir */
int b; /* b int türden bir değişkendir */
2000L /* long türden bir sabittir */
long l; /* l long türden bir değişkendir */
(<tür> *) 0x1B00 /* adres sabiti */
pointer /* içinde adres tutan bir değişken */
Gösterici (pointer) içinde adres bilgisi tutan bir değişkendir (nesnedir). Göstericiler de nesne oldukları için bellekte bir yer kaplarlar. Göstericilerin bellekte kapladıkları yerdeki 1’ler ve 0’ların bir tamsayı olarak yorumlanır, ve yorumlanan bu değer bir adres bilgisinin sayısal bileşenini gösterir.
Peki adres bilgisinin iki bileşenli bir bilgi olduğunu söylemiştik. Göstericinin değeri adresin sayısal bileşeni olarak yorumlanacaksa adresin tür bileşeni nasıl elde edilecek? Zira bellekte yalnızca 1 ler ve 0 lar var. Göstericilerin tuttuğu adres bilgilerinin sayısal bileşenleri göstericiler içinde saklanan tamsayının değeridir. Adres bilgisinin tür bileşeni ise göstericinin tanımlanması sırasında bildirilen türdür.
Adresler tamsayı görünümünde olsalar da tamsayı sabitleri gibi belirtilmezler. Çünkü tür bilgilerinin de belirtilmesi gerekir. Adres sabitleri, tamsayı türlerindeki sabitler üzerinde bilinçli tür dönüşümü yapılarak elde edilirler. Bir tamsayı sabitini adres türüne çevirmek için tür dönüştürme operatörü kullanılır.
(<tür> *) <tamsayı sabiti>
Tür dönüştürme operatörünün içindeki * adres ya da göstericiyi temsil etmektedir. Örneğin
0x1F00
hexadesimal olarak gösterilmiş int türden bir sabittir. Ancak:
(int *) 0x1F00
int türünden bir adres sabitidir.
0x16C0L
long türden bir tamsayı sabittir. Ancak:
(long *) 0x16C0L
long türden bir adres sabitidir. Bunun anlamı şudur: Derleyici 16C0 adresiyle belirtilen yerdeki bilgiyi long olarak yorumlayacaktır.
Adres türüne bilinçli dönüşüm yalnız sabitlerle yapılmayabilir, örneğin:
(char *) var
var isimli değişken hangi türden olursa olsun, yukarıdaki ifade ile char türden bir adres haline dönüştürülmüştür.
Bir adres bilgisini bir nesne içinde tutmak isteyelim. (Şu an için neden böyle bir şey isteyebileceğimiz sorusu akla gelebilir, ama ileride bunun çok doğal ve gerekli bir işlem olduğunu göreceğiz.) Bu işi nasıl gerçekleştireceğiz? İlk olarak aklımıza şu gelebilir: int türden bir nesne tanımlayalım ve adresin sayısal bileşenini tanımladığımız int türden nesne içinde tutalım. Yani adresin sayısal bileşeni olan tamsayıyı int türden bir nesneye atayalım. Bu durumda iki önemli sakınca ortaya çıkacaktır:
Söz konusu int nesnenin değerine programın herhangi bir yerinde tekrar ulaştığımızda, bunun bir adres bilgisinin (yani iki bileşenli bir bilginin) sayısal bileşeni mi yoksa int türden normal bir değer mi olarak yorumlanacağını nereden bileceğiz? Peki örneğin değişkenin isminden, değerinin bir adres bilgisinin sayısal bileşeni olduğu sonucunu çıkardığımızı düşünelim, bu durumda adresin tür bileşeninin ne olduğunu nereden anlayacağız?
O zaman belki de şu önerilecektir: int türden bir adres bilgisini int türden bir nesnede, char türden bir adres bilgisini char türden bir nesnede, double türden bir adres bilgisini ise double türden bir nesnede saklayalım, vs. Ama örneğin 64K'lık bir adres alanının söz konusu olduğunu düşünelim. toplam 65535 byte söz konusu olabileceğine göre bize 2byte uzunluğunda bir nesne gerekecek. Örneğin 1 byte uzunlukta bir nesne içinde ancak ilk 255 byte'a ilişkin sayısal bileşenleri tutarken, 8 byte uzunluğunda bir nesne içinde de gerekmediği halde çok büyük bir alana ilişkin adres bilgisini tutabiliriz.
int sabitleri int türden değişkenlere, gerçek sayı sabitleri gerçek sayı türünden değişkenlere doğal olarak atanıyorlar. Yani her sabit türünün doğal olarak atanabileceği türden bir değişken tanımlayabiliyoruz. İşte adres de ayrı bir tür olduğuna göre adres türünün de doğal olarak atanabileceği değişkenler tanımlanabilir. Bu değişkenlere (nesnelere) gösterici (pointer) denir.
‘a’ /* char türden bir sabittir */
char a; /* a char türden bir değişkendir */
int b; /* b int türden bir değişkendir */
2000L /* long türden bir sabittir */
long l; /* l long türden bir değişkendir */
(<tür> *) 0x1B00 /* adres sabiti */
pointer /* içinde adres tutan bir değişken */
Gösterici (pointer) içinde adres bilgisi tutan bir değişkendir (nesnedir). Göstericiler de nesne oldukları için bellekte bir yer kaplarlar. Göstericilerin bellekte kapladıkları yerdeki 1’ler ve 0’ların bir tamsayı olarak yorumlanır, ve yorumlanan bu değer bir adres bilgisinin sayısal bileşenini gösterir.
Peki adres bilgisinin iki bileşenli bir bilgi olduğunu söylemiştik. Göstericinin değeri adresin sayısal bileşeni olarak yorumlanacaksa adresin tür bileşeni nasıl elde edilecek? Zira bellekte yalnızca 1 ler ve 0 lar var. Göstericilerin tuttuğu adres bilgilerinin sayısal bileşenleri göstericiler içinde saklanan tamsayının değeridir. Adres bilgisinin tür bileşeni ise göstericinin tanımlanması sırasında bildirilen türdür.