CodeBlanks Logo Icon CodeBlanks

Ham işaretçiler

*const T ve *mut T ham işaretçilerini kullanırsın.

Ham işaretçiler

*const T ve *mut T, referansların aksine: boş (null) olabilir, geçersiz belleği gösterebilir, ödünç kurallarına uymaz ve otomatik temizlenmez. Aritmetik yapılabilir:

let v = [10, 20, 30];
let p: *const i32 = v.as_ptr();
unsafe {
    println!("{}", *p.add(1));   // 20
}
println!("{}", p.is_null());     // false
let bos: *const i32 = std::ptr::null();

add(n), işaretçiyi n eleman ilerletir (bayt değil). Dizinin dışına çıkmak tanımsız davranıştır.

Referanstan işaretçiye

Referanstan ham işaretçiye geçiş her zaman güvenlidir; tersi unsafe'tir çünkü işaretçinin geçerli olduğunu sen garanti etmelisin:

let x = 42;
let p = &x as *const i32;              // güvenli
let p2 = std::ptr::addr_of!(x);        // aynısı, ara referans olmadan
let r: &i32 = unsafe { &*p };          // unsafe: p geçerli olmalı

Ham işaretçiler en çok FFI'da ve kendi veri yapılarını (bağlı liste, ağaç) yazarken kullanılır.

Uygulama İşaretçi aritmetiği

let v = [10, 20, 30]; için as_ptr() ile işaretçi al. unsafe blokta ikinci ve üçüncü elemanı add ile oku; ikisini ve is_null() sonucunu boşlukla yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn main() {
    let v = [10, 20, 30];
    let p = v.as_ptr();
    let (a, b) = unsafe { (*p.add(1), *p.add(2)) };
    println!("{} {} {}", a, b, p.is_null());
}

Beklenen çıktı

20 30 false

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Tanımsız davranış (UB) nedir?

  • Panic
  • Uyarı
  • Derleyicinin hiçbir garanti vermediği durum; program her şeyi yapabilir Doğru cevap
  • Derleme hatası

Açıklama: UB bazen "çalışıyor" görünür; optimizasyon düzeyi ya da derleyici sürümü değişince bozulabilir. Miri aracı UB'yi yakalamaya yardım eder.

2 İşaretçiyi ilerlet

Soru
let p = v.as_ptr();
let ikinci = unsafe { *p.____(1) };
Cevap
let p = v.as_ptr();
let ikinci = unsafe { *p.add(1) };

Açıklama: add(n) işaretçiyi n eleman ilerletir.

3 İfade ve güvenlik

Kavram Anlamı
v.as_ptr() Güvenli
p.is_null() Güvenli denetim
*p.add(1) unsafe
std::ptr::null() Boş işaretçi

İleri seviye bölümündeki tüm dersler