İşaretçi aritmetiği, C dilinin temel bir özelliği olup, bellekle çalışmayı esnek hale getirir, ancak potansiyel olarak tehlikelidir.
İşaretçi aritmetiği, düşük seviyeli dillerin özelliklerinden kaynaklanmıştır ve dizilerle çalışma ve yapılandırılmış verilerin doğrudan bellekle işlenmesine odaklanmaktadır. C dilinde tüm işaretçiler, işaret ettikleri türün boyutunu "bilirler".
Birçok geliştirici, işaretçiye bir birim eklediğinde adresin tam olarak bir bayt artacağını düşündüğünde yanlışlık yapar. Aslında artış, sizeof(tip) kadar olur. Farklı veri türleri ile çalışırken, özellikle farklı boyutlardaki yapılarla, bellek geçişlerinde hata yapmak kolaydır. Ayrıca, void* ile işaretçi aritmetiğine izin verilmez - bu standart bir hatadır.
Tüm işaretçi ile yapılan aritmetik işlemler ilgili türün boyutunu dikkate alır, bu da dizilerle yapılan işlemleri en etkili hale getirir. Örneğin:
#include <stdio.h> int arr[4] = {10, 20, 30, 40}; int *p = arr; printf("%d\n", *(p + 2)); // 30 yazdırır
Burada (p + 2) işaretçiyi 2 * sizeof(int) bayt ileri taşır, sadece 2 bayt değil.
Ana Özellikler:
Void işaretçileri ile artırım/azaltım işlemleri yapabilir miyiz?
Hayır, C standardı void* ile aritmetiği yasaklar. Öncelikle işaretçi belirli bir türe cast edilmelidir, örneğin (char*), sonra aritmetik yapılabilir.
void *vp = arr; char *cp = (char *)vp; cp++;
Bir dizi veya yapı işaretçisine, dizinin boyutunu aşan bir değer eklersek ne olur?
Bu, geçerli bellek alanının dışına çıkmaya yol açar (tanımsız davranış). C dizilerin sınırlarını kontrol etmez - sorumluluk geliştiricide.
İki işaretçiyi doğrudan toplayabilir miyiz?
Hayır, işaretçileri toplamak yasaktır ve anlamı yoktur. Sadece aynı diziye ait iki işaretçi arasında çıkartma yapmak kabul edilebilir.
Genç bir geliştirici, int dizisi ile çalışırken, işaretçiyi belirli bir bayt sayısı kadar kaydırdı, türün boyutunu unutmuştu.
Artılar:
Eksiler:
Deneyimli bir geliştirici her zaman (ptr + n) gibi ifadeleri kullanır ve kaydırmayı tür boyutuyla ölçeklendirmek için derleyiciye güvenir.
Artılar:
Eksiler: