Школа создателей компьютерных игр

BannerDrive.ru
[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Указатели



Подпишитесь на рассылку "Создание компьютерных игр"

Рассылки Subscribe.Ru
Создание компьютерных игр

Рассылка выходит раз в месяц.


Понравился сайт? Узнайте, как помочь сайту.


Рекомендуемые книги


Андре Ламот.
Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации


Андре Ламот.
Программирование игр для Windows. Советы профессионала


Проголосуйте за сайт в рейтинге GameTop!
(нажмите на кнопку рейтинга)

GameTop - рейтинг игровых ресурсов. Портал Rolemancer (www.rolemancer.ru)

Не забывайте, что результаты рейтинга обновляются раз в неделю. Пожалуйста, голосуйте почаще!


Статистика посещаемости

Rambler's Top100

Рекурсия | Все обучалки раздела | Указатели часть 2

Описание

Наконец-то раскрывается вопрос, что такое указатели.

Программа использует указатель для обеспечения доступа функции к переменной.

Скачать обучалку (Visual C++ 6)

Работа программы

Исходный код

//            - "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 

Скачать обучалку (Visual C++ 6)

Рекурсия | Все обучалки раздела | Указатели часть 2

[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Copyright © 2003-2005 Евгений Казеко. Все права защищены. E-mail: evgeniy@kazeko.com

www.keramos.ru Купить пробковую плитку. Магазин и склад. , предлагаем пеноплекс , Самые качественные тележки рокля в новосибирске , Лучшее. совсем не короткий Однако ничто. Качество.