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; 


 

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

36379. Состав САПР. Компоненты видов обеспечения САПР 45.5 KB
  Составными частями САПР жестко связанными с организационной структурой проектной организации являются подсистемы в которых при помощи специализированных комплексных средств решается последовательность задач проектирования. Проектирующие подсистемы имеют объектную ориентацию и реализуют определенный этап проектирования или группы непосредственно связанных проектных задач например эскизное проектирование изделий проектирование корпусных деталей проектирование ТП механической обработки. Компоненты видов обеспечения Средства...
36380. Схемы внешних электрических и трубных проводок. Основные требования и правила выполнения 36 KB
  Схемы внешних электрических и трубных проводок. Схема соединений внешних проводок это комбинированная схема на которой показывают электрические и трубные связи между приборами и средствами автоматизации установленными на технологическом оборудовании вне щитов и на щитах а также подключения проводок к приборам и щитам. Схему подключения допускается не выполнять если все подключения могут быть показаны на схеме соединений внешних проводок. При необходимости раздельного изображения электрических и трубных проводок цеха участка...
36381. Учет персонала 29.58 KB
  Учет персонала. Взаимосвязи подсистемы Учет персонала : Из подсистемы АНАЛИЗ и УПРАВЛЕНИЕ приказы нормативы и запросы на получение информации. Информация из бухгалтерии о расходах на содержание персонала отчеты по начислениям з платы и прочие денежные выплаты. Различные отчеты и сводки для подсистемы АНАЛИЗ и УПРАВЛЕНИЕ об использовании персонала численность и качественный состав работников данные для статистики расходы на содержание персонала и т.
36382. Экстремальные регуляторы 51.93 KB
  Задача поиска экстремума разбивается на две части 1 определение отклонений от точки экстремума изучение объекта 2 организация движения к точке экстремума. ЭР с запоминанием экстремума: ЭР вкл в себя ЗУ – зап. В резте устанавливается автоколебательный режим работы регра около точки экстремума. Если Х0 сигнум – реле не меняет направление вращения ИМ если Х0 то производится реверс ИМ изменяется направление поиска экстремума.
36383. Дайте классификацию и поясните сущность интегральных критериев качества 35.68 KB
  Наибольшее распространение получили три интегральных критерия: А линейный Б квадратичный В квадратичная оценка отклонения от эталона А Линейный критерий качества 6 6 где отклонение переходного процесса от устойчивого значения; Уmt – функция веса ε1tmemtedttm Возможности критерия 7: 1У0t=t0=1 7 Критерий J10 7 – площадь под кривой переходного процесса с учетом знака рис. 2 Критерий J10 7 пригоден только для анализа апериодических процессов. В этом случае J10=min...
36384. Моделирование на ЭВМ типовых звеньев САУ 59.29 KB
  Моделирование на ЭВМ типовых звеньев САУ В состав структурных схем большинства систем автоматического управления САУ входит достаточно ограниченный набор типовых звеньев. В основу процедуры моделирования многих типовых звеньев положен метод РунгеКутта. Апериодическое звено первого порядка Реальное дифференцирующее звено Пропорциональноинтегральное звено Структурные схемы некоторых типовых звеньев. При моделировании более сложных звеньев таких как апериодическое пропорциональноинтегральное дифференциальное и т.
36385. Принцип действия термопары и термометра сопротивления 37.39 KB
  Термопара – два разнородных с различной концентрацией свободных электронов металлических проводника – термоэлектроды соединенных пайкой или сваркой на измерительном рабочем конце подвергаемом воздействию измеряемой температуры и разомкнутых на контрольном свободном конце находящемся под воздействием известной температуры и подключаемом к измерительному прибору. Принцип действия термопреобразователей сопротивления или резистивных детекторов температуры основан на способности металлов или полупроводниковых материалов изменять...
36386. Техническое обеспечение САПР 12.99 KB
  Выделяют автоматизированные рабочие места АРМ трех классов: микро АРМ для решения простых конструкторских и технологических задач в автономном режиме в составе средств двухуровневой САПР. Средние АРМ помимо задач выполняемых микро АРМ посредством графического процессора позволяют представлять объект проектирования в двух и трехмерном виде имеют пакеты прикладных программ инвариантные к различным видам объекта проектирования. Супер АРМ способны решать весь комплекс задач САПР в масштабе предприятия. Все вычислительные комплексы САПР в том...
36387. Универсальные CADCAMCAE-системы 12.71 KB
  Универсальные CDCMCEсистемы. Системы проектирования в масштабах предприятия за рубежом принято определять как CD CM CE – системы функции автоматизированного проектирования распределяются в них следующим образом: модули CD Computer ided Design – для геометрического моделирования и машинной графики модули подсистемы CM Computer ided Mnufcturing – для технологической подготовки производства а модули CE Computer ided Engineering – для инженерных расчетов и анализа с целью поверки проектных решений. Все универсальные CD CM CE –...