3.1 İşaretçi (Pointer) ve Dolaylı Erişim (Indirection)
C++'da bir İşaretçi (Pointer), bir veri değerini değil, o verinin bellekteki Adresini (Address) saklayan bir değişkendir. Akademik olarak bu, bir düzey Dolaylı Erişim (Indirection) sağlar.
Adres Operatörü (Address-of Operator - &)
Bir nesnenin bellekteki başlangıç konumunu (location) elde etmek için kullanılır. Her nesnenin yaşam süresi boyunca sabit bir adresi vardır.
İçerik Operatörü (Dereference Operator - *)
İşaretçinin gösterdiği adresteki değere erişmek için kullanılır. Geçersiz bir adreste bu işlemi yapmak Tanımsız Davranış (Undefined Behavior) ile sonuçlanır.
3.2 Bellek Adresleme Modeli
İşaretçinin (Pointer) ve İşaret Edilenin (Pointee) bellek üzerindeki ilişkisi.
Şema 3.1: Bellek İşaretleme ve Adres Çözümleme (Address Resolution)
3.3 İleri Seviye: İşaretçi Aritmetiği ve Sabitlik
#include <iostream>
#include <array>
/**
* @brief İşaretçi Aritmetiği (Pointer Arithmetic) ve Const Correctness Analizi
* MISRA C++:2023 Rule: İşaretçi aritmetiği sadece diziler (arrays) üzerinde yapılmalıdır.
*/
void analiz_et() {
int dizi[] = {10, 20, 30, 40, 50};
// Sabit Veriye İşaretçi (Pointer to Constant)
const int* ptr_to_const = &dizi[0];
// *ptr_to_const = 100; // HATA: Veri değiştirilemez!
// Sabit İşaretçi (Constant Pointer)
int* const const_ptr = &dizi[0];
// const_ptr = &dizi[1]; // HATA: Adres değiştirilemez!
// İşaretçi Aritmetiği (Pointer Arithmetic)
auto ptr = dizi; // dizi ismi ilk elemanın adresidir (decay)
std::cout << "Ilk: " << *ptr << std::endl;
std::cout << "Ikinci: " << *(ptr + 1) << std::endl; // Adres + sizeof(int)
}
int main() {
analiz_et();
return 0;
}
Mimarın Analizi:
C++'da bir dizi ismi, bir ifade içerisinde kullanıldığında otomatik olarak ilk elemanının adresine dönüşür. Buna Dizi Bozulması (Array Decay) denir. Akademik olarak diziler ve işaretçiler aynı şey değildir, ancak aralarında güçlü bir semantik bağ vardır.
Const-Correctness:
`const int*` (veriyi korur) ile `int* const` (adresi korur) arasındaki farkı anlamak, büyük ölçekli sistemlerde veri bütünlüğünü (Data Integrity) sağlamak için kritiktir.
⚠️ Bellek Güvenliği Hataları (Memory Safety Pitfalls)
3.5 Ölçme ve Değerlendirme
Soru: `int* const p = &x;` ifadesi neyi garanti eder?
Pratik Görev (Telegram Challenge):
"trcpp-telegram topluluğundan gelen bir soru: Bir tamsayı dizisi tanımlayın. Bu dizinin elemanlarına SADECE işaretçi aritmetiği kullanarak ve köşeli parantez `[]` operatörünü ASLA kullanmadan erişip değerlerini iki katına çıkaran bir fonksiyon yazın."