Среда, 15.08.2018, 06:36
Discovery
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Форма входа
Категории раздела
PHP [1]
Уроки по PHP для начинающих
C++ [18]
Статьи посвященные С++
XML [2]
Статьи по XML
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
     Каталог статей
    -->
    Главная » Статьи » Программирование » C++

    Указатели.

    Указатели.

    Прежде чем разбираться  с указателями в С++, давайте вспомним а для чего нужны указатели? Любой ответит не задумываясь, чтоб найти что-нибудь в незнакомом месте. Если вы никогда до этого не были в каком-то месте, правильно установленный указатель подскажет вам направление, к тому месту, которое вам нужно. В С++ указатель указывает на ячейки памяти, выделенные компьютером для переменной. А так как у каждой переменной свой тип, а значит и количество ячеек, выделенных под переменную данного (обычно одна ячейка равна 1 байту), то прежде чем использовать указатель мы должны объявить его подобно тому, как мы объявляем переменную. В низу мы объявляем указатель на переменную типа char:

    char *point;

    А теперь давайте попробуем понять, на что он указывает? Правильный ответ: ни на что, точно так же как табличка, весящая где-либо, является просто табличкой, до тех пор, пока на ней ничего не написано. Что бы сделать это, достаточно присвоить указателю имя переменной, поставив перед ней ампресанд. Сам указатель нужно записывать без звездочки. Вот так:

    point = &test;

    Данные, хранящиеся в указателе point, и есть адрес переменной test. Чтобы понять, что, такое адрес, давайте себе представим следующую ситуацию… Мы приезжаем в село или деревню и спрашиваем жителя села: «Вы не подскажете, где здесь живет Вася Пупкин?» Скорее всего, он покажет вам дом Васи или объяснит, как к нему пройти, добавив – «Голубой дом с зеленым забором и есть дом Пупкиных». Ведь он местный, а значит, знает тут всех. Точно так же поступает и компилятор, который знает адреса всех переменных. Теперь мы можем объявить указатель, присвоить ему адрес какой-нибудь переменной и вывести его на экран. Указатель является такой же переменной, как и обычная переменная. В него можно записывать адреса другой переменной столько раз, сколько это нам потребуется. И так вот наша программа, которая получает адрес переменной test и выводит его на экран:

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        int test = 10;
        int *point;

        point = &test;

        cout << "Адрес переменной test в шестнадцатеричной системе: ";
        cout << point << "\n";

        cout << "\n\n";
        system("PAUSE");
        return 0;
    }

    При выполнении данной программы у меня получилось адрес переменной test 22FF74, что будет 2293620, если перевести 22FF74 из шестнадцатеричной системы в десятеричную.

    С помощью указателя можно изменить значение переменной test. Чтоб узнать, как это происходит, давайте немного изменим предыдущую программу:

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        int test = 10;
        int *point;

        point = &test;

        cout << "Значение переменной test до \n"
               << "изменения ее значения с помощью\n"
               << "указателя: test = " << test << "\n\n";

        *point = 20;

        cout << "Значение переменной test после \n"
               << "изменения ее значения с помощью\n"
               << "указателя: test = " << test << "\n\n";

        cout << "\n\n";
        system("PAUSE");
        return 0;
    }

    Теперь давайте разберемся, зачем вообще нужны указатели. Ведь можно просто обратиться к переменной по ее имени, результат будет одинаковым. Но, к сожалению это не всегда так. В С++ есть такое понятие, как область видимости переменной, т. е. есть переменные, которые известны в любом участке программы. Их называют глобальными. И есть переменные, которые видны только в приделах определенного блока (например, цикла). Их называют локальными. Когда имя локальной переменной, объявленной в цикле, совпадает именем глобальной, то во время выполнения цикла, программа обращается к локальной переменной, а как только она выходит из цикла к глобальной. Внизу  код программы с использованием глобальной переменной, и локальной с таким же именем:

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        int test = 10;

        cout << "Значение переменной test до выполнения цикла: "
               << test << "\n\n";

        for(int i=0;i<1;i++)
        {
            int test = 35;

            cout << "Результат выполнения данной программы:\n\n";

            cout << "Значение переменной test в цикле: "
                   << test << "\n\n";
        }

        cout << "Значение переменной test после выполнения "
               << "цикла: " << test << "\n";

        cout << "\n\n";
        system("PAUSE");
        return 0;
    }

    Результат выполнения данной программы:

    Значение переменной test до выполнения цикла: 10

    Значение переменной test в цикле: 35

    Значение переменной test после выполнения цикла: 10

    Иногда возникают ситуации, когда значение локальной переменной за пределами блока, в котором она объявлена.  Как быть в этом случаи? Здесь нам и пригодятся указатели. Давайте немного изменим предыдущую программу (код внизу):

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        int test;
        int test_loop;
        int *p;

        p = &test_loop;
        cout << "Результат выполнения данной программы:\n\n"
               << "Введите значение глобальной переменной test: ";
        cin >> test;
        cout << "\nЗначение глобальной переменной test до выполнения цикла: "
               << test << "\n\n";

        for(int i=0;i<1;i++)
        {
            int test;
            cout << "Введите значение локальной переменной test: ";
            cin >> test;
            *p = test;
            cout << "\nЗначение локальной переменной test в цикле: "
                   << test << "\n\n";
        }

        cout << "Значение глобальной переменной test после выполнения "
               << "цикла: " << test << "\n\n"
               << "Значение локальной переменной test в цикле: "
               << test_loop << "\n\n";

        cout << "\n\n";
        system("PAUSE");
        return 0;
    }

    Результат выполнения данной программы:

    Введите значение глобальной переменной test: 10

    Значение глобальной переменной test до выполнения цикла: 10

    Введите значение локальной переменной test: 35

    Значение локальной переменной test в цикле: 35

    Значение глобальной переменной test после выполнения цикла: 10

    Значение локальной переменной test в цикле: 35

    Теперь немного о том, как мы вывели значение локальной переменной за пределами блока, в котором она была объявлена. Сначала мы объявили указатель p (тип int). Затем мы записали в него адрес переменной test_loop инструкцией  p = &test_loop; . В цикле инструкцией *p = test; мы присвоили переменой, адрес которой записан в указателе p значение переменной test объявленной в цикле. А далее достаточно просто вывести значение переменной test_loop на экран.

    В прошлых уроках мы написали программу, которая переводит американские мили в километры, а градусы по Фаренгейту в градусы по Цельсию и обратно. Допустим, вы решили продавать эту программу, и решили дать возможность попробовать программу несколько раз бесплатно, чтоб решить будут ее они покупать или нет. Внизу один из вариантов программы с защитой от несанкционированного использования:

    #include <iostream>
    #include <cstring>
    #include <windows.h>
    using namespace std;

    int main( )
    {
        char password[80];
        bool Enter = 0;
        int *p;
        int cod;

        p = &cod;

        do
        {
            cout << "Введите пароль: ";
            cin >> password;

            Enter = !(strcmp(password, "password"));

            if(Enter)
            {
                cout << "Введите полученный вами код: ";
                int cod;
                cin >> cod;
                *p = cod;
            }
            break;
        }
        while(Enter);

        if(cod == 7945)
        {
            int exit;

                for(exit=0; exit != 5; )
                {
                    int choice;
                    double miles, kilometers, Celsius, Fahrenheit;

                    cout << "\n\n"
                           << "Данный конвертор переводит американские мили\n"
                           << "в километры, километры в американские мили,\n"
                           << "температуру по шкале Фаренгейта в температуру\n"
                           << "по шкале Цельсия и температуру по шкале Цельсия\n"
                           << "в температуру по шкале Фаренгейта.\n\n\n";

                    cout << "Для того чтобы перевести американские мили в ки-\n"
                           << "лометры нажмите 1.\n\n";

                    cout << "Для того чтобы перевести километры в американские\n"
                           << "мили нажмите 2.\n\n";

                    cout << "Для того чтобы перевести температуру по шкале Фа-\n"
                           << "ренгейта в температуру по шкале Цельсия нажмите 3.\n\n";

                    cout << "Для того чтобы перевести температуру по шкале Цель-\n"
                           << "сия в температуру по шкале Фаренгейта нажмите 4.\n\n";

                    cout << "Для выхода из программы нажмите клавишу 5. \n\n";

                    cin >> choice;

                    if(choice == 1)
                    {
                        cout << "Введите количество миль: ";
                        cin >> miles;
                        kilometers = miles * 1.609;
                        cout << "Это будет " << kilometers <<"km\n\n";
                    }
                    else if(choice == 2)
                    {
                        cout << "Введите количество километров: ";
                        cin >> kilometers;
                        miles = kilometers / 1.609;
                        cout << "Это будет " << miles << " \n\n";
                    }
                    else if(choice == 3)
                    {
                        cout << "Введите температуру по шкале Фаренгейту:\n\n";
                        cin >> Fahrenheit;
                        Celsius = (Fahrenheit - 32) * 100 / (212 - 32);
                        cout << "\n" << Fahrenheit << " град. по Фаренгейту будет "
                               << Celsius << " град. по Цельсию.\n\n";
                    }
                    else if(choice == 4)
                    {
                        cout << "Введите температуру по шкале Цельсия:\n\n";
                        cin >> Celsius;
                        Fahrenheit = Celsius  *  (212 - 32) / 100 + 32;
                        cout << "\n" << Celsius << " град. по Цельсию будет "
                               << Fahrenheit << " град. по Фаренгейту.\n\n";
                    }
                    else if(choice == 5)
                    {
                exit = choice;
                }
            }
        }
        return 0;
    }

    В следующем уроке мы продолжим тему указателей.

    Категория: C++ | Добавил: stranger140569 (30.03.2013)
    Просмотров: 866 | Рейтинг: 5.0/1
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *:
    Copyright MyCorp © 2018
    Конструктор сайтов - uCoz