=C/C++ = *ptr++,++*ptr ve *++ptr arasındaki fark-
CCpp pointerlar çok fazla kullanım şekli olması nedeniyle özellikle C/Cpp’da yeni olan programcılar için kafa karışıklığına sebebiyet verebiliyor.
Bu yazımda,yazının başlığında da belirttiğim gibi ön ek,arttırma(++) ve eksiltme(- -) operatörlerin pointer üzerindeki etkisini inceleyceğiz.
Operatör ve öncelikleri hakkında bilgi edinmek için şu veya bulinkten faydalanabilirsiniz.
NOT:Kod örnekleri Cpp için veriliyor. Ancak aynı şekilde C’de yazıp test edebilirsiniz.
İlk olarak aşağıdaki kod parçalarını ve çıktılarına göz atalım.
Verilen örneklerde char tipi bir dizi(char arr[]) kullanılacak ve bu dizinin alanına erişen bir pointer üzerinden operatörler kullanılacaktır.
Yukarıda verilen örneklerin çıktılarını incelediğimizde,özellikle “Örnek 3” çıktısı “char arr[]” dizi içeriğiyle uyuşmadığını görüyoruz.
Çıktılara hızlıca göz attıktan sonra ilk örnekten başlayalım.
İlk örnekde(Örnek 1) herhangi bir operatör kullanılmamış. Sadece bir atama “char *ptr = arr;” yer alıyor.
Bu atama sonucunda “*ptr” pointeri arr[] dizinin ilk elemanını işaret edecektir. Dolayısıyla “char c = arr[0];” eşdeğerdir.
İkinci örnek çıktısını incelediğimizde, pointerin “*ptr++” kullanımıyla dizide sıradaki elemana geçildiği görülüyor.
Operatörlerin öncelikleri ve işleyiş sırasını hatırlarsak,pointer üzerinde yapılan işlem aslında şöyledir: *(ptr++).
Dolayısıyla “char c = arr[1];” olarak erişim gerçekleştirilmiş ve çıktı “e” olmuştur.
Örnek 3 çıktısı garip şekilde char dizi içeriği dışında bir çıktı ile sonuçlandığını görüyoruz.
Pointeri açıklamaya geçmeden önce aynı örneği bu kez int türü bir dizi üzerinden inceleyelim:
Örnek 3 tekrar:
Bu örneğin “int arr[]” türü çıktısı ile,dizideki ilk eleman değerini arttırarak(+1) verdiğini kestiriyoruz.
Dolayısıyla bu örneğin “char arr[]” çıktısı da aynı şekilde ilk elemanı değerini +1 yaparak verdi. Yani M değeri harf sırasına göre +1 yapıldı.
Operatörlerin öncelikleri ve işleyiş sırasını hatırlarsak,pointer üzerinde yapılan işlem aslında şöyledir: *(++ptr).
Son örneğimiz olan “Örnek 4” çıktısı 2.örnekle aynı olduğunu görüyoruz.
Bu örnekteki pointer kullanımı “*++ptr;” her ne kadar örnek 3 ile benzerlik görsek de,ancak kesinlikle farklı sonuçlar verdiğini görüyoruz.
Dolayısıyla 2.örnek ile aradaki tek fark;bu örnekte ön arttırma yapıyorken, 2.örnekte son arttırma dediğimiz kavram işleniyor.
Operatörlerin öncelikleri ve işleyiş sırasını hatırlarsak,pointer üzerinde yapılan işlem aslında şöyledir: *(++ptr).
NOT: Ön arttırma ve son arttırma kavramları döngü ve kontrol blokları içinde kullanırken farklı sonuçlara sebebiyet verebilir.