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; 


 

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

30224. Изготовление модели повседневного платья 120 KB
  Формы костюма всегда развиваются параллельно с развитием общего стиля в искусстве и архитектуре определённой исторической эпохи, переживая вместе с ним все этапы эволюции. Современная мода допускает некоторые вольности в нашем костюме, подталкивает нас к тому, чтобы раскрепоститься, дать волю своему воображению и поэкспериментировать.
30225. Электроснабжение цеха каустизации и регенерации извести филиала ООО «Илимтехносервис» 2.04 MB
  Описание технологического процесса каустизации щелока Зеленый щелок из растворителя плава котельного цеха № 2 ТЭС с температурой не менее 85 ОС массовой концентрацией общей щелочи 112122 г дм3 в единицах Na2O сульфидностью не менее 28 подается в однокамерный осветлитель зеленого щелока № 5 № 6 поз. Осветленный зеленый щелок из осветлителя сливается в бак хранения зеленого щелока поз. 306140 откуда центробежными насосами поз. S72; S73 S74; S75 подается на гасители классификаторы поз.
30226. Технология приготовления и правила подачи салатов из варёных овощей 136 KB
  Классификация мяса Мясо классифицируют по виду убойных животных по полу возрасту по термическому состоянию упитанности и сортам . По качеству его делят на высший 1 2 3й сорта. В зависимости от сорта цвет пшена светлоили яркожелтый консистенция от мучнистой до стекловидной. Ядрицу обыкновенную и быстроразвариваюшуюся делят по качеству на 1 2 3й сорта.
30227. Информатизация общества: социальные условия, предпосылки и последствия 46 KB
  Социальные условия информатизации это реальная обстановка в которой происходит процесс информатизации. Социальные последствия информатизации реальные и прогнозируемые изменения в обществе происходящие под влиянием информатизации. Рассмотрение в этом смысле условий и предпосылок информатизации это анализ реального и необходимого состояния всех сфер жизни общества с точки зрения их готовности воспринять и развивать информатизацию; “социальное†в узком смысле слова.
30228. Формирование информационной среды общества 33 KB
  Формирование информационной среды общества Современное общество не может существовать в условиях сенсорного голода для его развития и саморганизации совершенно необходимо всеобъемлющее информационное поле. Например 1012 это требующий кардинальных решений порог уровня безработицы в обществе 14 это коэффициент характеризующий катастрофическое соотношение доходов 10 самых богатых и 10 самых бедных членов общества. Наиболее важным понятием которое необходимо определить при изучении информационной среды общества является понятие...
30229. Информационный образ жизни: общество и личность в условиях информатизации 37.5 KB
  Проблемы адаптации людей с ограниченными физическими возможностями в современной информационной среде. Например: во многих странах мира для слепых и слабовидящих людей широко применяются специальные синтезаторы позволяющие осуществлять голосовой ввод информации; практически полностью потерявшие подвижность могут осуществляють работу на компьютере ввод информации движением глаз при помощи специальных шлемов. В России создана специальная программа по компьютерной технике адаптированной для лиц имеющих различные физические отклонения...
30230. Постиндустриальное, информационное общество: социальная структура и специфика трудовой деятельности 22 KB
  Однако следует отметить что проблема “атомизации†общества обсуждается сегодня учеными все шире [1]. Поскольку получение информации о происходящем в стране и в мире уже не требует прямого общения между людьми человек может все больше и больше изолироваться от общества подвергаться иллюзии независимости от него. Американские исследователи отмечают что “конвергенция меняющихся общественных и личных ценностей с новой техникой и энергоэкономическими нуждами делает становление мозаичного общества по существу неизбежнымâ€[2]. Проблема...
30231. Социальная информатика: предмет и задачи курса 29 KB
  Одним из критериев перехода общества к постиндустриальной и далее к информационной стадии развития может служить процент населения занятого в сфере услуг: если в обществе более 50 населения занято в сфере услуг наступила постиндустриальная фаза его развития; если в обществе более 50 населения занято в сфере информационных услуг общество стало информационным. Концепция постиндустриального общества как общесоциологическая теория развития достаточно глубоко разработана западными исследователями: Д. Понятие...
30232. Семантические основы социальной информатики 56 KB
  Нередко в этих теоретических построениях термин информация наполнен разным смыслом а следовательно сами теории высвечивают лишь часть граней некоторой системы знаний которую можно назвать общей теорией информации или информологией наукой о процессах и задачах передачи распределения обработки и преобразования информации. Формализация знаний: методы и приемы. При поиске наиболее удобных рациональных средств и форм информационного обмена человек чаще всего сталкивается с проблемой компактного и...