Цепочка указателей в C
Здравствуйте, будущие кодировщики! Сегодня мы отправимся в увлекательное путешествие по магическому миру цепочек указателей в C. Не беспокойтесь, если вы новички в программировании - я буду вашим дружелюбным проводником, и мы рассмотрим эту тему шаг за шагом. Так что возьмите свои виртуальные палочки (клавиатуры) и погружайтесь с нами!
Что такое цепочка указателей в C?
Представьте, что вы на охоте за сокровищами, и вместо карты у вас есть серия подсказок. Каждая подсказка указывает на следующую, образуя цепочку, которая в конечном итоге приводит к сокровищу. Именно это и есть цепочка указателей в C!
В программировании на языке C цепочка указателей - этоsequence указателей, где каждый указатель указывает на другой указатель, за исключением последнего, который обычно указывает на переменную определенного типа данных.
Давайте начнем с простого примера:
int value = 42;
int *ptr1 = &value;
int **ptr2 = &ptr1;
int ***ptr3 = &ptr2;
В этом коде:
-
value
-是我们的宝藏(一个值为42的整数)。 -
ptr1
-是一个指向value
地址的指针。 -
ptr2
-是一个指向指针的指针(注意双重星号),它持有ptr1
的地址。 -
ptr3
-是一个指向指针的指针的指针(三重星号!)它持有ptr2
的地址。
это как матрешка указателей! ?
Как работает разыменование?
Теперь давайте поговорим о разыменовании. Разыменование похоже на открытие каждой матрешки, чтобы добраться до следующей. В нашей цепочке указателей мы используем asterisk (*
) для разыменования.
printf("Value: %d\n", ***ptr3);
Эта строка может показаться немного пугающей с тремя звездочками, но давайте разберем её:
-
*ptr3
gives us the address stored inptr2
-
**ptr3
(or*(*ptr3)
) gives us the address stored inptr1
-
***ptr3
(or*(*(*ptr3))
) finally gives us the value ofvalue
, which is 42
Это как сказать: "Открой большую куклу, затем открой中型 куклу внутри нее, затем открой малую куклу внутри той, чтобы найти сокровище!"
Цепочка указателей на числа с плавающей запятой
Давайте попробуем это с浮点数:
float pi = 3.14159;
float *fPtr1 = π
float **fPtr2 = &fPtr1;
float ***fPtr3 = &fPtr2;
printf("Value of pi: %f\n", ***fPtr3);
Это работает так же, как наш пример с целыми числами, но с浮点ными числами. Когда мы выводим ***fPtr3
, мы следуем по цепочке указателей обратно к значению pi
.
Обновление исходной переменной через разыменование
Одна из классных вещей в цепочках указателей - это то, что мы можем использовать их для изменения исходного значения. Давайте посмотрим, как это делается:
int score = 85;
int *scorePtr1 = &score;
int **scorePtr2 = &scorePtr1;
printf("Original score: %d\n", score);
**scorePtr2 = 90; // Обновление значения через цепочку указателей
printf("Updated score: %d\n", score);
В этом примере мы используем **scorePtr2
для изменения значения score
. Это как передать сообщение через цепочку людей, чтобы обновить табло!
Цепочка указателей на символы
Давайте закончим более сложным примером с использованием указателей на символы:
char letter = 'A';
char *charPtr1 = &letter;
char **charPtr2 = &charPtr1;
char ***charPtr3 = &charPtr2;
printf("Original letter: %c\n", ***charPtr3);
**charPtr2 = 'B'; // Обновление значения
printf("Updated letter: %c\n", letter);
Этот пример работает так же, как и наши предыдущие примеры, но с символами. Мы можем изменить是我们的字母 с 'A' на 'B' с помощью цепочки указателей.
Таблица методов
Вот удобная таблица, резюмирующая методы, о которых мы говорили:
Метод | Описание | Пример |
---|---|---|
Создание указателя | Используйте оператор & , чтобы получить адрес переменной |
int *ptr = &value; |
Разыменование | Используйте оператор * , чтобы получить значение, на которое указывает указатель |
int x = *ptr; |
Создание указателя на указатель | Используйте двойной asterisk **
|
int **ptr2 = &ptr1; |
Разыменование цепочки | Используйте несколько asterisks | int value = ***ptr3; |
Обновление через цепочку | Присваивайте значение, используя разыменованные указатели | **ptr2 = 90; |
И вот оно, друзья! Мы прошли извилистый путь цепочек указателей в C. Помните, что практика делает perfect, так что не бойтесь экспериментировать с этими концепциями. Before you know it, you'll be juggling pointers like a pro circus performer! ?
Счастливого кодирования, и пусть ваши указатели всегда указывают в правильном направлении! ?
Credits: Image by storyset