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.

graph LR subgraph Stack [Yığın Belleği] P[ptr: 0x7ffd] -- saklar --> ADDR[0x10A4] end subgraph Heap [Öbek Belleği] ADDR -- gösterir --> VAL[Value: 42] end style ADDR fill:#f9f,stroke:#333,stroke-width:2px style VAL fill:#bbf,stroke:#333,stroke-width:2px

Şema 3.1: Bellek İşaretleme ve Adres Çözümleme (Address Resolution)

3.3 İleri Seviye: İşaretçi Aritmetiği ve Sabitlik

pointer_architecture_analysis.cpp
#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)

Boş İşaretçi Erişimi (Nullptr Dereference): `nullptr` değerine sahip bir işaretçinin içeriğine erişmeye çalışmak. Modern C++'da `0` veya `NULL` yerine daima `nullptr` kullanılmalıdır.
Sınır Aşımı (Buffer Overflow): Dizi sınırlarının dışındaki bir adrese işaretçi aritmetiği ile erişmek. Bu, siber saldırıların %70'inin temel nedenidir.

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."