7 Temmuz 2009 Salı

Pointer ( İşaretçilerde ) Aritmetik İşlemler

İşaretçiler sadece tekil değerleri göstermezler, aynı zamanda dizilerin de başlangıç adresini tutarak diziymiş gibi davranır. Aslında dizilerin çalışma mantığı aşağıdaki gibidir:

Aşağıdaki örnekleri inceleyelim:

int *ip; // ip adında tam sayı değerleri tutacak bir işaretçi değişkenş oluşturuldu.
int a[10]; // 10 tane tam sayı tutacak, bellekten ard arda 10 tane hücre alındı.
ip = &a[3]; // Bu hücre dizisinin sol baştan 4. elemanının adresi adres tutan "ip" değişkenine atanır.

Bu durumun bellekteki durumunu inceleyecek olursak aşağıdaki gibi bir hal alır:







Artık işaretçimiz bir dizinin ilk adresinin gösterdiğine göre, bu adresten bir sonraki adrese ulaşmak için 1 ekleyebiliriz.

ip + 1
Peki işaretçiyi bir arttrmak ne demektir?. Tabiki de işaretçinin gösterdiği bellek hücresinin bir ilerlemesi olarak düşünebilirz.
O zaman " *( ip +1) = 5 " ifadesi ile " a[4] = 5 " ifadesi aynı şey olur.

Örneğin "ip" işaretçi değişkenin tutmuş olduğu adresi 1 arttırırsak ve bu adres değerini başka bir işaretçiye atarsak bellek durumu aşağıdaki gibi olur:







*ip2 = 4;
*( ip +1 ) = 4; İfadeleri aynı işlemi gerçekleştirir.
a[4] = 4;

Burada öenmli diğer bir husus ise * operatörünün anlaşılmasıdır. Yani:
1- " *(p+1) = 4; " ile

2- " *p +1 = 4;"

ifadeleri tamamen farklıdır.Birinci satırda "p+1" işaretçisinin göstermiş olduğu adrese 4 değerini ata demektir. 2. ifadede ise "ip" işaretçisinin göstermiş olduğu sayı değerini bir arttır daha sonra oluşan sayı değerine 5 ata demektir ki bu derleme hatasıdır. Çünkü değerler anca değişkenlere atanabilir. Bu işlemler dikkat etmemiz gerekir. Peki hazır birşekilde dizi operatörü varke bu bizim ne işimize yarar.? Aşağıdaki örneği inceleyiniz:

char katar[] = "Turkiye";

char* katarp = katar;

while(*katarp != NULL){
printf("%c", *katarp++);
}
getch();

Burada Türkiye katarı sırasıyla ekrana yazılır.
Bu yolla dizilerde yükseltgeme ve indirgeme operatörleri kullanılabilir.

Bu şekilde en azından dizilerde kullanmamız gereken indisler için boşuna bellek alanı kullanmamış oluruz. :) İleride CvMat, CvArr ve IplImage gibi yapılarda resim bilgisi üzerinde dolaşmak için bu yapılarıda bazen kullanacağız. Esenlikle ...

0 yorum:

Yorum Gönder