Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Studies

מצביעים כפולים

זהו זמן מתאים לדבר גם על מצביעים למצביעים. מצביע הוא משתנה לכל דבר - יש לו ערך וכתובת בזכרון. למשל:

#include <stdio.h>
int main(void) {
    int x = 5;
    int *xptr = &x;
    printf("xptr value: %p\n", xptr);
    printf("xptr address: %p\n", &xptr);
    printf("xptr dereferenced value: %d\n", *xptr);
}

לכן, אין שום מניעה להגדיר משתנה שהוא עצמו מצביע למצביע:

int main(void) {
    int x = 5;
    int *xptr = &x;
    int **x_double_ptr = &xptr;
}

בדוגמא, x הוא משתנה מטיפוס int, xptr הוא משתנה מסוג int * והוא מצביע למשתנה int, ו-x_double_ptr הוא מצביע למצביע למשתנה מסוג int.

מצביעים למצביעים אינם המצאה מופרכת בכלל והם שימושיים בדיוק כמו מצביעים רגילים. נזכיר כי התחלנו לדבר על מצביעים בהקשר של פונקציית ה-swap:

void swap(int *x, int *y) {
    int tmp = *x;
    *x = *y;
    *y = tmp;
}
int main(void) {
    int x = 5, y = 7;
    swap(&x, &y);
}

בצורה דומה לחלוטין, ניתן לחשוב על מקרה בו נרצה להחליף בין שני מצביעים - למשל, בין שני מערכים:

void swap(int **arr1, int **arr2) {
    int *tmp = *arr1;
    *arr1 = *arr2;
    *arr2 = tmp;
}

int main(void) {
    int arr1[] = {1, 2, 3, 4};
    int arr2[] = {-5, 10, -2, 1};
    swap(&arr1, &arr2);
}