Pointer — xotiradagi obyekt yoki funksiya manzilini ifodalovchi qiymatdir. C va C++ kabi tillarda pointer orqali dinamik xotira, massivlar, linked structure, callback va operatsion tizim API’lari bilan ishlanadi. Pointer obyektning o‘zi emas; u manzil va unga qanday type sifatida murojaat qilish haqidagi compile-time ma’lumotni birlashtiradi.
Manzil va dereference
& operatori obyekt manzilini, * esa pointer ko‘rsatgan qiymatni oladi:
int count = 7;
int *p = &count;
*p = 8;
Bu operatsiyadan keyin count sakkizga teng. Pointer type’i compilerga nechta byte va qanday interpretatsiya kerakligini bildiradi. void * umumiy obyekt manzilini tashishi mumkin, ammo dereference qilishdan oldin to‘g‘ri typega aylantiriladi.
Null pointer hech qanday valid obyektni ko‘rsatmasligini bildiradi. Uni dereference qilish undefined behavior. Null check faqat bir xavfni yopadi: non-null pointer ham lifetime tugagan obyektga, noto‘g‘ri alignmentga yoki ruxsat berilmagan xotiraga ishora qilishi mumkin.
Arithmetic va massiv
Pointer arithmetic byte emas, pointed type o‘lchami bo‘yicha yuradi. p + 1 keyingi element manzilini anglatadi. Standart bo‘yicha arithmetic ayni massiv ichida yoki uning oxiridan bitta keyingi pozitsiyagacha aniqlangan. Chegaradan tashqariga chiqib dereference qilish buffer overflow va xotira buzilishiga olib keladi.
Array ko‘p expressionlarda birinchi element pointeriga aylansa-da, array va pointer bir xil type emas. Array o‘z storage o‘lchamiga ega; function parameter’da esa o‘lcham alohida uzatilmasa yo‘qoladi. Pointer bilan birga length yoki end pointer berish xavfsiz iteratsiya uchun zarur.
Lifetime va ownership
Stack variable scope tugaganda unga pointer dangling bo‘ladi. Heap obyekt free yoki deletedan keyin ishlatilsa use-after-free yuz beradi. Bir obyektni ikki marta bo‘shatish allocator metadata’sini buzishi mumkin. Ownership qaysi kod obyektni bo‘shatishini aniq belgilaydi.
C++ smart pointerlari keng tarqalgan lifetime modellarini type orqali ifodalaydi: unique_ptr yagona ownership, shared_ptr reference counting, weak_ptr esa ownershipsiz kuzatuv beradi. Ular pointer arithmetic va barcha data race’ni avtomatik hal qilmaydi. Borrow qilingan raw pointer ownerdan uzoq yashamasligi shart.
Xavfsizlik va diagnostika
Compiler warning, static analyzer, AddressSanitizer va fuzzing invalid accessni topishga yordam beradi. ASLR manzillarni tasodifiylashtiradi, NX data sahifasida kod bajarilishini cheklaydi, lekin source’dagi xatoni tuzatmaydi. API contract nullability, length, mutability va ownershipni hujjatlashtirsa, pointer bilan ishlashdagi yashirin taxminlar kamayadi.
Function pointer va callback
Function pointer kod manzilini saqlab, callback yoki dispatch table yaratadi. Signature aynan mos bo‘lishi kerak; noto‘g‘ri calling convention register va stackni buzadi. Native plugin API function pointerlar jamlangan versionlangan struct berishi mumkin. Callback context uchun alohida void * uzatilsa uning lifetime’i callback chaqiriladigan muddatdan uzun bo‘ladi. Asinxron library callbackni ro‘yxatdan chiqarish bilan ayni paytda ishlayotgan chaqiruv tugaganini kafolatlamasligi mumkin; synchronization contract hujjatlashtiriladi. Hujumga uchragan writable function pointer control flow’ni o‘zgartirishi sabab RELRO, control-flow integrity va read-only dispatch table kabi hardening choralaridan foydalaniladi.
Aliasing
Ikki pointer bir obyektga ishora qilsa aliasing yuz beradi. Compiler optimallashtirishda qaysi yozuv qaysi o‘qishga ta’sir qilishini bilishi kerak. restrict kabi va’da noto‘g‘ri berilsa undefined behavior kelib chiqadi. Type punning ham alignment va strict aliasing qoidalariga mos bo‘ladi; byte representationni ko‘chirish uchun standart belgilagan xavfsiz usul tanlanadi.
Bog‘liq tushunchalar
Memory address, Dereference, Null pointer, Buffer overflow, Pointer arithmetic, Smart pointer, Memory ownership