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:
*ip2 = 4;
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:
*( 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