10238

Указатели. Структуры в C++

Лекция

Информатика, кибернетика и программирование

Лекция 10. Указатели. Структуры. 10.1 Указатели. Программы на C хранят переменные в памяти. Указатель представляет собой адрес памяти который указывает на определенный участок. 10.1.1 Использование указателя на символьную строку. Когда программа передает массив наприм

Русский

2013-03-24

82 KB

36 чел.

Лекция 10. Указатели. Структуры.

10.1 Указатели.

Программы на C++ хранят переменные в памяти. Указатель представляет собой адрес памяти, который указывает  на определенный участок.
10.1.1 Использование указателя на символьную строку.
  Когда программа передает массив (например, символьную строку) в функцию, C++ передает адрес первого элемента массива. В результате совершенно обычно для функции использовать указатель на символьную строку. Чтобы объявить указатель на символьную строку, функция просто предваряет имя переменной звездочкой:

                            void some_function(char *string); 

  Звездочка, которая предваряет имя переменной, указывает C++, что переменная будет хранить адрес памяти - указатель. Следующая программа использует указатель на символьную строку внутри функции show_string для вывода содержимого строки по одному символу за один раз.

 Primer 1 Лекция 10.

#include <iostream>

  using namespace std;

  void show_string(char *string)

  {

     while (*string != '\0')

     {

        cout << *string;

        string++;

      }

  }

  int main()

  {

     system("chcp 1251");

     show_string( "Язык C++!");

     system("pause");

  }

   Условие while (*string != '\0') проверяет, не является ли текущий символ, указываемый с помощью указателя string, символом NULL, который определяет последний символ строки. Если символ не NULL, цикл выводит текущий символ с помощью cout. Затем оператор string++; увеличивает указатель siring таким образом, что он указывает на следующий символ строки. Когда указатель string указывает на символ NULL, функция уже вывела строку и цикл завершается.

Строка, переданная в функцию, находится в памяти компьютера по адресу 1000. Каждый раз, когда функция увеличивает указатель string, он указывает на следующий символ (адрес 1001,1002, 1003).

  Используя указатель, функция может сканировать строку символов, пока не будет обнаружен символ
NULL. Следующая программа использует указатель на строку в функции string_length для определения количества символов в строке.

    Primer 2 Лекция 10.

#include <iostream>

  using namespace std;

  int string_length(char *string)

  {

     int length = 0;

     while (*string != '\0')

     {

        length++;

        string++;

     }

     return(length);

  }

  int main()

  {

     system("chcp 1251");

     char title[] = "Язык C++";

     cout << title << endl << "содержит " << string_length(title) << " символов" << endl;

     system("pause");

  }

   Когда программа передает массив в функцию, C++ передает адрес памяти первого элемента этого массива. Используя переменную-указатель, функция может перемещаться по содержимому массива, просто увеличивая значение указателя.

   10.1.2. Уменьшение количества операторов.

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

                                  while (*string != '\0'); 

  Cимвол NULL ('\0') представляет собой значение ASCII 0. Так как C++ использует значение 0, чтобы представить ложь, можно  записать предыдущий цикл следующим образом:

                                while (*string) 

В данном случае пока символ, определяемый указателем строки, не равен 0 (NULL), условие оценивается как истинное и цикл будет продолжаться. Постфиксная операция увеличения C++ позволяет использовать значение переменной, а затем увеличивает это значение. Программы на C++ используют постфиксные операции увеличения и уменьшения, чтобы сканировать массивы с помощью указателей. Например, использование постфиксной операции увеличения делает следующие циклы while идентичными:

 while (*string)

   {

      cout << *string++;

   }

   while (*string)

   {

      cout << *string;

      string++;

   } 

  Оператор cout << *string++ позволяет C++ вывести символ, указываемый указателем string, а затем увеличить текущее значение string, чтобы он указывал на следующий символ. С помощью этих методов следующая программа иллюстрирует новую реализацию функций show_string и string_length:

    Primer 3 Лекция 10.

#include <iostream>

  using namespace std;

  int show_string(char *string)

  {

     while (*string) cout << *string++;

     cout << endl;

  }

     int string_length(char *string)

  {

     int length = 0;

     while (*string++) length++;

     return(length);

  }

  int main()

  {

     system("chcp 1251");

     char title[] = "Язык C++";

     show_string(title);

     cout << "содержит " << string_length(title) << " символов" << endl;

     system("pause");

  }

10.1.3.Сканирование символьной строки.

Одно из наиболее употребляемых использовании указателей в программах на C++ заключается в сканировании символьных строк. Для уменьшения количества кода многие программы используют следующие операторы для сканирования строки:

while (*string)

      {

         // операторы

         string++;

         // продвинуть к следующему символу

      }

10.1.4. Использование указателей с другими типами массивов.

  Указатели широко используются с символьными строками. Можно использовать указатели с массивами других типов. Следующая программа использует указатель на массив типа float для вывода значений с плавающей точкой:

Primer 4 Лекция 10.

#include <iostream>

  using namespace std;

  int show_float(float *array, int number_of_elements)

  {

     int i;

     for (i = 0; i < number_of_elements; i++) cout << *array++ << endl;

  }

  int main()

  {

     

     system("chcp 1251");

     float values[5]={1.1, 2.2, 3.3, 4.4, 5.5};

     show_float(values, 5);

     system("pause");

  }

  Внутри функции show_float цикл for использует значение, указываемое с помощью указателя array, а затем увеличивает этот указатель до следующего значения. В данном случае программа должна передать параметр, который задает количество элементов массива, поскольку в отличие от символьных строк массивы типа float (или int, long и т. д.) не используют символ NULL для определения последнего элемента.
  Программы могут использовать указатели на массивы любых типов. В предыдущей программе функция show_float увеличивала указатель для продвижения по массиву типа float. Указатель указывает на участок памяти, содержащий значение определенного типа, например char, int или float. Когда функция сканирует массив с помощью указателя, функция увеличивает указатель для продвижения от одного значения к следующему. Чтобы указатель указывал на следующий элемент массива, C++ должен знать размер каждого элемента (в байтах), чтобы определить, на сколько необходимо увеличить значение указателя.  Для продвижения указа-
теля к следующему символу в массиве, C++ должен увеличить значение указателя на 1. Однако, чтобы указать следующее значение в массиве типа int C++ должен увеличить указатель на два байта (значение типа int занимает два байта памяти). Для значений типа. float C++ увеличивает указатель на 4 байта. Зная тип значения, на которое указывает указатель, C++ знает, на сколько необходимо увеличить значение этого указателя. В программах просто используется
оператор увеличения, например pointer++. Однако C++ увеличивает реальное значение (адрес памяти), содержащееся в указателе, на корректную величину.

   10.2. Структуры.

  C++ позволяет хранить в массиве связанную информацию одного и того же типа. Группировка связанных значений в массив очень удобна. В большинстве случаев программам необходимо группировать связанную информацию разного типа.
  Если вашей программе требуется хранить связанную информацию разных типов, она может использовать
структуру.

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

   10.2.1. Объявление структуры.

  Структура определяет шаблон, с помощью которого программа может позднее объявить одну или несколько переменных. Другими словами, программа сначала определяет структуру, а затем объявляет переменные типы этой структуры. Для определения структуры программы используют ключевое слово struct, за которым обычно следует имя и левая фигурная скобка. Следом за открывающей фигурной скобкой указывается тип и имя одного или нескольких элементов. За последним элементом вы размещаете правую закрывающую фигурную скобку. В этот момент можно (необязательно) объявить переменные данной структуры:

struct name

   {

      int member_name_l; //Объявления элементов структуры

      float member_name_2; 

   } variable; //  Объявление переменной

   

  Следующее определение создает структуру, содержащую информацию о служащем:

   struct employee

   {

      char name [64];

      long employee_id;

      float salary;

      char phone[10];

      int office_number;

   }; 

  В данном случае определение не объявляет какие-либо переменные типа этой структуры. После того как определена структура, программа может объявить переменные типы этой структуры, используя имя структуры :

         employee boss, worker, new_employee; //Объявление переменных

  В данном случае оператор создает три переменные структуры employee. В некоторых случаях можно увидеть объявление, в котором структура предваряется ключевым словом struct:

                    struct employee boss, worker, new_employee; 

  Ключевое слово struct является обязательным при программировании на С, так что некоторые программисты могут включать его по привычке. Однако в C++ использовать ключевое слово struct необязательно.
  
Структура позволяет программам группировать информацию, называемую элементами, в одной переменной. Чтобы присвоить значение элементу или обратиться к значению элемента, используйте оператор C++ точку (.). Следующие операторы присваивают значения различным элементам переменной с именем worker струтуры employee;

                           worker.employee_id = 12345;

                           worker.salary = 25000.00;

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

Primer 5 Лекция 10.

#include <iostream>

  #include <string.h>

  using namespace std;

  int main()

  {

      system("chcp 1251");

      struct employee

     {

        char name [64];

        long employee_id;

        float salary;

        char phone[10];

        int office_number;

     } worker;

  // Копировать имя в строку strcpy(worker.name, "Иванов");

     worker.employee_id = 12345;

     worker.salary = 25000.00;

     worker.office_number = 102;

  // Копировать номер телефона в строку strcpy(worker.phone, "555-1212");

     cout << "Служащий: " << worker.name << endl;

     cout << "Телефон: " << worker.phone << endl;

     cout << "Номер служащего: " << worker.employee_id << endl;

     cout << "Оклад: " << worker.salary << endl;

     cout << "Офис: " << worker.office_number << endl;

     system("pause");

  }

  Присваивание целому элементу и элементу с плавающей точкой очень просто. Программа использует оператор присваивания, чтобы присвоить значение соответствующему элементу. Функция strcpy для копирования символьной строки в элементы name и phone. Если не инициализировать элементы при объявлении переменной типа данной структуры, необходимо копировать символьные строки в символьно-строковые элементы.


    10.2.2. Объявление переменных структуры.

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

                            variable.member = some_value;

  Если функция не изменяет структуру, можно передать структуру в функцию по имени. Следующая программа использует функцию show_employee для вывода элементов структуры типа employee:

  Primer 6 Лекция 10.

#include <iostream.h>

  #include <string.h>

  using namespace std;

  struct employee

  {

     char name[64];

     long employee_id;

     float salary;

     char phone[10];

     int office_number;

  };

  int show_employee(employee worker)

  {

     cout << "Служащий: " << worker.name << endl;

     cout << "Телефон: " << worker.phone << endl;

     cout << "Номер служащего: " << worker. employee_id << endl;

     cout << "Оклад: " << worker.salary << endl;

     cout << "Офис: " << worker.office_number << endl;

  }

  int main()

  {

      system("chcp 1251");

     employee worker;

  // Копировать имя в строку strcpy(worker.name, "Джон Дой");

     worker.employee_id = 12345;

     worker.salary = 25000.00;

     worker.office_number = 102;

  // Копировать номер телефона в строку strcpy(worker.phone, "555-1212");

     show_employee(worker);

     system("pause");

  }

  Программа передает переменную типа данной структуры worker в функцию show__employee по имени. Далее функция show_employee выводит элементы структуры. Однако обратите внимание, что программа теперь определяет структуру employee вне main и до функции show_employee. Поскольку функция объявляет переменную worker типа employee, определение структуры employee должно располагаться до функции.

   Если функция изменяет параметр, следует передавать этот параметр в функцию с помощью адреса. Если функция изменяет элемент структуры, вы должны передавать эту структуру в функцию с помощью адреса, Для передачи переменной типа структуры с помощью адреса вы предваряете имя переменной оператором адреса C++ (&):

                                    some_function(&worker); 

  Внутри функции, которая изменяет один или несколько элементов, следует работать с указателем. Если использовать указатель на структуру, легче всего обращаться к элементам структуры, используя следующий синтаксис:

                           pointer_variable->member = some_value; 


 

А также другие работы, которые могут Вас заинтересовать

68651. Расчет тепловой схемы турбинной установки К-220-44 Ровенской АЭС 4.76 MB
  В данном дипломном проекте поверхностно рассмотрен первый и второй контур первого блока Ровенской АЭС с реактором ВВЭР-440.Приведен расчет тепловой схемы турбинной установки К-220-44 а также теплогидравлический и нейтронно-физический расчет реактора типа ВВЭР-440.
68652. РАСЧЕТ ЯДЕРНОГО РЕАКТОРА ВВЭР-1000 1.01 MB
  В активной зоне реактора она нагревается до 595 0К и направляется в парогенераторы где охлаждается отдавая тепло рабочему телу второго контура. Вода первого контура при работе реактора приобретает высокую наведённую радиоактивность даже без нарушения плотности оболочек ТВЭЛов так как в воде практически...
68653. Разработка математической модели оценки платежеспособности корпоративного заемщика 1.71 MB
  Обзор основных моделей которые применятся в банках для анализа кредитоспособности платежеспособности потенциальных заемщиков. Контрольный пример использования математического аппарата в разработки методики анализа кредитоспособности заемщика. Перечень графических материалов...
68655. Разработка технологии создания учебного пособия и проверкаэффективность в реальном творческом проекте 1.05 MB
  Цель данного дипломного проекта – разработать технологию создания учебного пособия и проверить ее эффективность в реальном творческом проекте. Реализация данной цели требует содержательного и методического решения следующих задач: изучить историю и теорию Web-дизайна разработать концептуальную модель учебника...
68656. Конструкторско-технологическая часть проекта упаковки для пищевой промышленности 2.47 MB
  В современной жизни упаковка прочно вошла в наш быт, и сопровождает человека на всех стадиях его деятельности. По состоянию развития упаковочной индустрии стали судить об экономическом и техническом уровне той или иной страны. Наиболее развитые страны вкладывают значительные средства в эту сферу.
68659. Расчет показателей надежности и безопасности АЭУ Запорожской АЭС 3.96 MB
  Площадка Запорожской АЭС проектной мощностью 6000 МВт расположена в Каменско-Днепровском районе Запорожской области вблизи действующей Запорожской ГРЭС. Электростанция предназначена для снабжения электроэнергией южных районов Украины и входит в Объединенную энергосистему Юга.