10238

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

Лекция

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

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

Русский

2013-03-24

82 KB

35 чел.

Лекция 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; 


 

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

72932. Философия как система теоретического знания и тип мировоззрения. История философии 141.5 KB
  Философия имеет ряд разделов: онтологию – учение о бытии, гносеологию – учение о познании, аксиологию – учение о ценностях. Выделяют социальную философию и философию истории, а также философскую антропологию – учение о человеке. Философия – это не все мировоззрение, а лишь одна из его форм.
72933. Динамічна анатомія 78.5 KB
  Локомоції — група рухів зі зміною площі опори й з переміщенням тіла з одного місця на інше. У цій групі виділяють 2 різновиду рухів. До першого відносять циклічні рухи, що складаються з окремих повторюваних циклів (хода, біг, плавання, лижні перегони, ковзанярський спорт, веслування й ін.).
72934. Ранние цивилизации: Египет, Передняя Азия, Индия, Китай 25.72 KB
  Самые первые государства на земле появляются в долинах крупных рек Нила, Тигра, Евфрата, там, где возможно было создать оросительные (ирригационные) системы – основу поливного земледелия. В долинах этих рек люди гораздо меньше, чем в других местах, зависели от природных условий, получали стабильные урожаи.
72935. Античная цивилизация. Древняя Греция 33.96 KB
  Самые высокие оценки греческой цивилизации не кажутся преувеличенными. Мысль о чуде греческой цивилизации вызвана скорее всего ее необычайно быстрым расцветов. Создание греческой цивилизации относится к эпохе культурного переворота VII V вв.
72936. Біосфера. Роль В.І.Вернадського у вивченні біосфери. Ноосфера 33.73 KB
  Жива речовина. Що принципово відрізняє нашу планету від будь-якої іншої планети Сонячної системи? Наявність життя. «Якби на Землі не було життя, — писав академік В. І. Вернадський, — обличчя її було б так само незмінним і хімічно інертним, як нерухоме обличчя Місяця, як інертні уламки небесних світил».
72938. Радіація в біосфері. Наслідки Чорнобильської катастрофи 27.4 KB
  Внаслідок міграції разом з атмосферним повітрям водою їжею радіонукліди потрапляють в організм людини накопичуються там і спричинюють його внутрішнє опромінення. Щоб запобігти наслідкам опромінення вживають заходів щодо обмеження зовнішнього і внутрішнього опромінення персоналу...
72939. Сучасна наука про довкілля 21.65 KB
  Вагомим внеском у становленні екології були праці К. Мебіуса (1877), який запропонував поняття «біоценоз» і Ф.Даля (1890),який ввів у наукове використання термін «екотоп». На початку ХХ ст. американські дослідники Ф.Клементс,Р. Адамс,В.Шелфорд розробили основи і методи дослідження угрупувань живих організмів.
72940. Планування аудиту 60.5 KB
  Планування аудиту означає розробку загальної стратегії виконання завдання та плану аудиту для зменшення аудиторського ризику до прийнятно низького рівня. В плануванні беруть участь партнер з завдання та ключовий персонал групи з завдання, що дозволяє отримати користь...