// Done by TheTutor -- 06/02/01
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
/* Назначение этой программы - показать, как используются указатели. Эта программа
состоит из одной функции, которая обменивает между собой значения двух целочисленных
переменных, передаваемых в функцию. Этот "обмен" будет выполнен с использованием
указателей. */
#include <stdio.h>
#include <stdlib.h> // Определяет EXIT_SUCCESS
// Мы хотим написать функцию, которая берет две переменные и обменивает из значения.
// Как вы увидите, есть правильный и неправильный способ сделать это
void swap_wrong(int num1, int num2);
void swap_correct(int *num1, int *num2);
// Функция печатает значения num1 и num2 отдельными строками
void disp_numbers(int num1, int num2);
int main()
{
int num1 = 52;
int num2 = 44;
printf("Initial values of num1 and num2\n");
disp_numbers(num1,num2);
// Эта функция не изменит числа
swap_wrong(num1,num2);
printf("\nAfter calling swap_wrong() on num1 and num2...\n");
disp_numbers(num1,num2);
// Эта функция правильно изменит числа
swap_correct(&num1, &num2);
/* Что означает & впереди num1 и num2?
Помните объявление функции void swap_correct(int *num1, int *num2); ?
Это значит, что вы должны передать в функцию указатели. Но num1 и num2
это не указатели. Мы ставим знак & перед именами переменных, что означает "адрес в памяти".
Таким образом, мы передаем в функцию адреса переменных в памяти и эти адреса являются
указателями. */
printf("\nAfter calling swap_correct() on num1 and num2...\n");
disp_numbers(num1,num2);
return EXIT_SUCCESS; // Сообщает операционной системе, что программа завершилась без проблем.
}
void swap_wrong(int num1, int num2)
{
// Назначение этой функции - обменивать значения num1 и num2
// Сперва мы создадим временный номер для хранения num1
int temp = num1;
// Теперь мы сохраним значение num2 в num1
num1 = num2;
// И наконец, мы запишем значение num1 (сохраненное в temp) в num2
num2 = temp;
/* Это должно работать - за исключением того, что когда эта функция завершается,
значения переменных остаются без изменений. Это потому что здесь проявляется
очень важный аспект функций. Когда в функции передаются переменные, функции
создают локальные копии этих переменных. Когда создаются переменные num1 и num2:
int num1 = 52;
int num2 = 44;
программа выделяет этим переменным память. Когда вызывается функция swap_wrong(),
выделяется память для временных копий num1 и num2. Вы можете изменять их значения
в любое время. Но когда функция завершит работу, эти временные копии num1 и num2 будут
уничтожены.
Но что если вы хотите изменить значения? Это можно сделать с помощью swap_correct() */
} // конец swap_wrong(int num1, int num2)
void swap_correct(int *num1, int *num2)
{
int temp;
/* Назначение этой функции - менять местами значения num1 и num2.
Сперва мы создадим временную переменную для хранения num1
Что делает *? Если бы мы захотели напечатать num1, мы бы увидели длинное
число. Попробуйте - удалив знак комментария ниже */
// printf("\nnum1 = %d\n",num1);
/* Это потому что num1 (внутри этой функции) является адресом в памяти.
Нам не нужно значение этого адреса. Нам нужно то, что хранится по этому
адресу. Это то, что делает *. Она дает нам то, что хранится по адресу памяти. */
temp = *num1;
// Теперь мы сохраним значение num2 в num1
*num1 = *num2;
// И наконец, мы поместим значение num1 (сохраненное в temp) в num2
*num2 = temp;
}
/* Это функция, которая печатает значения num1 и num2 на отдельных строках.
Я знал, что буду печатать эти значения более одного раза, поэтому вместо того,
чтобы печатать везде два оператора printf() - просто вызываем эту функцию. */
void disp_numbers(int num1, int num2)
{
printf("num1 = %d\n",num1);
printf("num2 = %d\n",num2);
}
// © 2001 GameTutorials
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
|