Ham işaretçiler
- Rust kursu
- İleri seviye
- Ders 31/81
- 4 dk
*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
fn main() {
// buraya yaz
}Örnek çözüm
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
let p = v.as_ptr();
let ikinci = unsafe { *p.____(1) };
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 |