// - "Talk to me like I'm a 3 year old!" Programming Lessons -
//
// $Author: Ben Humphrey digiben@gametutorials.com
//
// $Program: Pointers
//
// $Description: Understanding pointers the simplest way
//
// $Date: 6/20/00
//
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
#include <stdio.h> // Нам нужно подключить его для использования printf().
void IncreaseNumber(int Number); // Это следовало бы поместить в .h файл,
void IncreaseNumber2(int *Number); // но я не хочу создавать новый файл для 2 объявлений.
void IncreaseNumber(int Number) // Это функция, которая просто увеличивает "Number" на 5.
{
// "Number" это локальная переменная, которая создается и
// которой присваивается значение числа, передаваемого в функцию.
Number += 5;
// Увеличиваем на 5 значение Number. Это не затрагивает число, передаваемое в функцию.
}
// Если мы хотим изменить именно то число, которое передается в функцию, мы должны дать функции адрес
// переменной в памяти, использовав "*"
void IncreaseNumber2(int *Number)
{
*Number += 5;
}
/* Вот функция, которая увеличивает то число, что передается в функцию.
Теперь "Number" называется "указатель", поскольку "Number" это адрес переменной
в памяти, имеющий значение вроде этого: "0x00fffec2".
Если мы не поставим "*" впереди "Number", то при выполнении оператора увеличения,
переменной будет присвоен адрес памяти "0x00000005", что приведет к сбою программы.
Подстановкой "*" впереди "Number" мы получаем именно значение, находящееся
по адресу памяти, которое равняется нулю. Взгляните:
"Number += 5" == "0x00fffec2 += 5" : Приведет к сбою
"*Number += 5" == "0 += 5" : Равно 5.
0x00fffec2 это шестнадцатеричное число указывающее на ячейку памяти.
Переменная Number на самом деле необязательно будет равняться этому числу,
просто так я показываю, как выглядят адреса памяти.
Небольшое примечание насчет шестнадцатеричной системы:
a = 10, b = 11, c = 12, d = 13, e = 14, f = 15.
Вместо чисел после девяти используются буквы, потому что 10 и выше состоят из 2 чисел.
0x10 не равно 10. 0xa = 10
*/
void main() // Начало программы
{
int num = 0; // Объявим целочисленную переменную и установим в 0;
IncreaseNumber(num); // Передадим num в нашу первую функцию.
printf("Num now equals: %d\n\n", num); // Напечатаем значение num.
// Вы увидите, что будет напечатан 0. Значение num не изменилось.
IncreaseNumber2(&num);
// Теперь мы передаем num второй функции, которой требуется адрес в памяти.
// Используем "&" чтобы передать функции адрес переменной "num".
printf("Num now equals: %d\n\n", num);
// Печатаем значение "num". Оно равно 5! Видите разницу?
}
// © 2001 GameTutorials
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
|