Asia/Baku
06:36:50
Posts

Pointer-lar: Yaddaşın Sehrli Açarı

March 4, 2025
Proqramlaşdırma dünyasına yeni başlayanlar üçün “pointer” (göstərici) sözü bəzən qorxulu səslənə bilər. “Bu nədir?”, “Niyə buna ehtiyac var?” və ya “Niyə sadəcə dəyişənlərdən istifadə etmirik?” kimi suallar ağla gəlir. Ancaq bir az dərindən baxdıqda, pointer-ların proqramlaşdırmada nə qədər güclü və faydalı olduğunu görürsünüz. Bu məqalədə pointer-ların nə olduğunu, necə işlədiyini, harada istifadə edildiyini və onların üstünlüklərini detallı şəkildə izah edəcəyəm. Hazırsınızsa, gəlin yaddaşın dərinliklərinə səyahətə çıxaq! Sadə dildə desək, pointer bir dəyişənin yaddaş ünvanını saxlayan xüsusi bir dəyişəndir. Proqramlaşdırmada hər dəyişən yaddaşda müəyyən bir ünvanda saxlanılır – bu ünvan adətən rəqəmlərlə ifadə olunur (məsələn, 0x7fff5fbff8a4). Pointer isə bu ünvanı “göstərir” və bizə dəyişənin dəyərinə birbaşa və ya dolayısı ilə daxil olmaq imkanı verir. Məsələn, C dilində bir pointer belə təyin olunur:
int x = 10;
int *ptr = &x;
Burada:
  • x bir tam ədəddir və yaddaşda bir ünvanda saxlanılır.
  • &x operatoru x-in yaddaş ünvanını alır.
  • *ptr isə bu ünvanı saxlayan pointer-dır.
Pointer-ları başa düşmək üçün yaddaşı bir sıra qutular kimi təsəvvür edin. Hər qutunun bir nömrəsi (ünvanı) və içindəki dəyəri var. Normal dəyişən sizə qutunun içindəki dəyəri verir, pointer isə qutunun nömrəsini (ünvanını) saxlayır və sizə deyir: “Get, bu ünvana bax və oradakı dəyəri al.” Misala baxaq:
#include <stdio.h>

int main() {
    int x = 10;
    int *ptr = &x;

    printf("x-in dəyəri: %d\n", x);
    printf("x-in ünvanı: %p\n", &x);
    printf("ptr-dəki ünvan: %p\n", ptr);
    printf("ptr-in göstərdiyi dəyər: %d\n", *ptr);

    return 0;
}
Bu kodun çıxışı:
  • x-in dəyəri: 10
  • x-in ünvanı: 0x7fff5fbff8a4 (təxmini ünvan)
  • ptr-dəki ünvan: 0x7fff5fbff8a4
  • ptr-in göstərdiyi dəyər: 10
Burada *ptr yazaraq pointer-in göstərdiyi ünvandakı dəyərə (yəni x-in dəyərinə) çatıb 10 alırık. Bu prosesə dereferencing (ünvana müraciət) deyilir.
  • & Operatoru: Dəyişənin ünvanını alır (məsələn, &x).
  • *** Operatoru**: Pointer-in göstərdiyi ünvandakı dəyəri qaytarır (məsələn, *ptr).
  • Dinamik Yaddaş: Pointer-lar mallocfree kimi funksiyalarla yaddaşı idarə edir.
  • Strukturlarla İş: Pointer-lar mürəkkəb data strukturlarını (məsələn, linked list) bağlayır.
“Sadə dəyişənlər varkən niyə pointer istifadə edək?” sualı ağla gələ bilər. Gəlin bunun cavabını praktik misallarla izah edək:
  1. Dəyəri Funksiyada Dəyişmək Pointer ilə ünvanı göndərərək orijinal dəyəri dəyişə bilirik:
void changeValue(int *p) {
    *p = 20;
}

int main() {
    int x = 10;
    changeValue(&x);
    printf("Yeni dəyər: %d\n", x);
    return 0;
}
  1. Dinamik Yaddaş İdarəetməsi Böyük proqramlarda yaddaş ayırmaq üçün:
int *arr = (int*)malloc(5 * sizeof(int));
arr[0] = 1;
arr[1] = 2;
free(arr);
  1. Mürəkkəb Data Strukturları Linked list kimi strukturlarda:
struct Node {
    int data;
    struct Node *next;
};
  • C: Pointer-ların ən çox istifadə olunduğu dil.
  • C++: Pointer-lar və referencelər (&) ilə genişləndirilib.
  • Rust: Təhlükəsiz “smart pointer” təklif edir.
Pointer-larla işləyərkən bəzi risklər var:
  • Null Pointer: Pointer NULL olarsa və *ptr edilərsə, proqram çökə bilər.
  • Dangling Pointer: Yaddaş azad edilibsə, amma pointer hələ də ora işarə edirsə, problem yarana bilər.
  • Yaddaş Sızması: free unudulduqda yaddaş boşa xərclənir.
Bu çətinliklərə baxmayaraq, pointer-lar yaddaşla birbaşa işləməyi öyrənmək üçün əvəzolunmaz təcrübədir. Pointer-lar proqramlaşdırmada yaddaşın idarə edilməsinin açarıdır. Onlar ilk baxışda qarışıq görünsə də, öyrəndikcə nə qədər güclü olduğunu anlayırsınız. Bir full stack developer kimi mənə aşağı səviyyəli dillərin bu cür mexanizmləri həm performans, həm də nəzarət baxımından nə qədər dəyərli olduğunu göstərdi. Əgər siz də C, C++ və ya oxşar dillərlə işləyirsinizsə, pointer-ları mütləq öyrənin – bu, kod yazma tərzinizi tamamilə dəyişə bilər! Uğurlar! 🚀