=C/C++ = *ptr++,++*ptr ve *++ptr arasındaki fark-

Kerim Fırat
3 min readOct 9, 2020

--

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.

Örnek 1 — Çıktı: M
Örnek 2 — Çıktı: e
Örnek 3 - Çıktı: N
Örnek 4 — Çıktı: e

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:

Örnek 3 tekrar — Çıktı: 11

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.

--

--

Kerim Fırat
Kerim Fırat

Written by Kerim Fırat

Senior Android Platform(AOSP,AAOS) Architect,Open Source Contributor | Turkey Java User Group Vice Chairman | Author

No responses yet