Реализация логики обмена значений
Теперь давайте реализуем фактическую логику обмена значений с использованием указателей.
Присваивание адресов указателям
Сначала нам нужно сделать так, чтобы наши указатели указывали на наши переменные, присвоив адреса переменных a и b соответственно указателям ptra и ptrb:
// Assign addresses to pointers
ptra = &a;
ptrb = &b;
Алгоритм обмена значений с использованием указателей
Ключ к обмену значений с помощью указателей - это манипулирование значениями в ячейках памяти, а не просто указателями самими по себе. Вот как мы это сделаем:
- Сохраните значение переменной
a (доступное через *ptra) во временной переменной temp.
- Присвойте значение переменной
b (доступное через *ptrb) переменной a (с использованием *ptra).
- Присвойте временное значение (исходное значение переменной
a) переменной b (с использованием *ptrb).
Обновите файл main.c, добавив следующий код в место, указанное на предыдущем шаге:
#include <stdio.h>
int main() {
// Declare variables
int a, b;
int *ptra, *ptrb;
int temp;
// Get input from user
printf("Enter value for a: ");
scanf("%d", &a);
printf("Enter value for b: ");
scanf("%d", &b);
// Display original values
printf("\nOriginal values:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
// Assign addresses to pointers
ptra = &a;
ptrb = &b;
// Display memory addresses (optional but helpful for understanding)
printf("\nMemory addresses:\n");
printf("Address of a: %p\n", ptra);
printf("Address of b: %p\n", ptrb);
// Swap the values using pointers
temp = *ptra; // Store value of a in temp
*ptra = *ptrb; // Assign value of b to a
*ptrb = temp; // Assign original value of a to b
// Display swapped values
printf("\nAfter swapping:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
Понимание логики обмена значений
Давайте разберёмся, как именно работает обмен значений:
temp = *ptra; - Оператор * разыменовывает указатель, давая доступ к значению в ячейке памяти. Эта строка сохраняет значение переменной a в переменной temp.
*ptra = *ptrb; - Эта строка присваивает значение переменной b ячейке памяти переменной a, фактически изменяя значение переменной a.
*ptrb = temp; - Эта строка присваивает исходное значение переменной a (сохраненное в temp) ячейке памяти переменной b, завершая обмен значений.
После этих операций переменные a и b поменяли значения без прямого изменения их - мы только изменили значения в их ячейках памяти.