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; 


 

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

56317. Періодичний закон Д.І. Менделєєва 121 KB
  Мета: ознайомити учнів з періодичним законом хімічних елементів; формувати уявлення про періодичну зміну властивостей хімічних елементів; показати загальну залежність і розвиток неорганічної природи...
56318. Програми роботи з таблицями 78.5 KB
  Ми завершуємо ознайомлення з табличними величинами та програмами роботи з таблицями. Ви вмієте описувати масиви, вводити і виводити елементи масивів, складати програми опрацювання табличних величин. Але треба бути уважним і добре розуміти, що робиш і для чого.
56319. ЗАГАЛЬНІ ПОЛОЖЕННЯ НАПИСАННЯ ТЕКСТУ НАУКОВОЇ РОБОТИ ТА ЙОГО ОФОРМЛЕННЯ 24.36 KB
  Які існують прийоми осмислення тексту (і виділення інформаційно-смислових блоків)? Психологи називають три такі прийоми: виділення смислових опорних пунктів (або ключових слів), антиципація та реціпація
56320. ОСОБЛИВОСТІ МЕТОДИЧНОГО ЗАБЕЗПЕЧЕННЯ УЧБОВИХ ТА УЧБОВО-ДОСЛІДНИЦЬКИХ РОБІТ НА ПРИКЛАДІ УЧБОВОГО РЕФЕРАТУ, КОНТРОЛЬНОЇ Й КУРСОВОЇ РОБОТИ 18.36 KB
  Реферат (від латинського refezo – доповідаю, повідомляю) – це короткий виклад змісту документа або його частини, що включає основні фактичні відомості та висновки, необхідні для початкового ознайомлення з документом і доцільності звернення до нього.
56321. ОСОБЛИВОСТІ МЕТОДИЧНОГО ЗАБЕЗПЕЧЕННЯ УЧБОВИХ ТА УЧБОВО-ДОСЛІДНИЦЬКИХ РОБІТ НА ПРИКЛАДІ ДИПЛОМНОЇ (ВИПУСКНОЇ) РОБОТИ 17.12 KB
  Дипломна робота – це вид навчально-дослідницької діяльності, орієнтованої на розвиток вміння самостійно виконувати науковий аналіз питань, пов'язаних із специфікою освоюваної професії. Дипломна робота є заключним періодом навчання у вищій школі, так як вона виконується на випускному курсі під керівництвом наукового керівника.
56322. Нацистский «новый порядок» в Европе 110 KB
  Движение Сопротивления в Европе Цели движения Сопротивления: Движение Сопротивления - это освободительное движение в оккупированных странах Формы движения Сопротивления против внешнего и внутреннего фашизма и установленного фашистами порядка.
56323. ЗАГАЛЬНІ ПОЛОЖЕННЯ ЛОГІЧНИХ ДОВОДІВ (АРГУМЕНТАЦІЙ) 20.3 KB
  Наукове знання, як уже відомо, це результат наукового дослідження, перевірений суспільно-історичною практикою і не суперечить логіці. Значить, в будь-якому дослідженні, крім чуттєвого пізнання, використовується абстрактне мислення чи логічне пізнання.