מצביעים כפולים
זהו זמן מתאים לדבר גם על מצביעים למצביעים. מצביע הוא משתנה לכל דבר - יש לו ערך וכתובת בזכרון. למשל:
#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);
}