Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
П_5_6.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.37 Mб
Скачать

3.2.3 Динамическое выделение памяти под структуру и массив структур

Для выделения памяти будем использовать операцию new. Для освобождения – операцию delete.

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

Пример: Объявить структурный тип, объединяющий характеристики книги. Выделить динамически память на одну структуру и на массив структур.

//объявление типа

struct book {

char*name; //название;

char *author; //автор;

int year ; //год издания;

int pages ; //количество страниц;

};

book * une ; // объявим указатель на структуру типа book;

une = new ( book); // выделение памяти на одну структуру;

une->year=2009; //присваивание полю year значения, что эквивалентно

// (*une).year =2009;

delete une ; // освобождение памяти, выделенной на одну структуру;

une = new book [9] ; // выделение памяти на массив структур типа book;

une[0].year = 1999; // эквивалентно une->year=1999;

(une+1)-> year=2001 // эквивалентно une[1].year =2001

delete [ ] une ; //освобождение памяти, выделенной на массив структур;

      1. Элементы структур

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

struct { int i1, i2 ; char c [4]; } str;

  1. Элементом структуры не может быть структура того же типа:

Struct def { def a , int b; } ; // - ошибка!

  1. Элементом структуры может быть указатель того же структурного типа:

struct good { good* B ; float C; };

  1. Элемент, предназначенный для хранения символьных строк (например, фамилии человека), может быть описан как символьный массив:

struct { сhar fio [ 20];…; } A;

и тогда:

а) нельзя присвоить полю fio значение строковой константы, используя, оператор:

A.fio = “Петров”; – не допустимо!

так как имя массива – указатель константа и нельзя ему присвоить новое значение адреса строки;

б) чтобы поместить в это поле fio строку с фамилией надо воспользоваться оператором копирования:

Strspy ( a.Fio, “ Петров”) ;

прототип встроенной функции strcpy:

char* strcpy (char*s1 , char* s2);

представлен в модуле string.h, функция strcpy копирует символы строки s2 в строку s1 и возвращает адрес строки s1;

в) можно ввести значения компонента fio с клавиатуры (т.к. память под элементы массива выделена), например:

cin>> A.fio ; /* ввод начинается от первого символа, отличного от пробела до первого обобщенного пробела; в конце строки в память помещается двоичный ноль */

cin.getline( A.fio, 20);

/*вводятся любые символы, включая и пробелы; чтение происходит до наступления одного из событий: прочитаны 19 символов или ранее появился символ перехода на новую строку ‘\n (при вводе с клавиатуры это означает, что была нажата клавиша Enter); в конце строки в память помещается двоичный ноль */

г) допустимо посимвольное присваивание:

A.fio [0] = ‘П’ ;

  1. Элемент, предназначенный для хранения строковой информации, может быть представлен в виде указателя на char

struct { char* FIO ; …; } st;

и тогда:

а) допустима операция присваивания указателю адреса строки:

st.FIO=” Григорьев”;

в этом случае указателю присваивается адрес участка памяти, выделенного строковой константе;

б) при использовании указателя для представления символьной строки выделяется память только на указатель, а под элементы строки память не выделяется; если в данном случае надо ввести значение строки с клавиатуры (или из файла), следует динамически выделить участок памяти и присоединить к нему указатель FIO. Затем произвести ввод строки, например, так:

st.FIO=new char [20];

cin>> st.FIO;