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

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

Указатели часть 2



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

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

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


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


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


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


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


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

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

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


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

Rambler's Top100

Указатели | Все обучалки раздела | Динамическая память

Описание

Указатели это достаточно сложный вопрос. Стоит рассмотреть эту тему подробнее.

Программа производит "обмен" значений переменных с помощью функции, использующей указатели.

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

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

Исходный код

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

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

Указатели | Все обучалки раздела | Динамическая память

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

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

Отделка лоджии для тебя; strojsam.ru - сантехника и мебель; размеры трубка термоусадочная тур