Обратите внимание, что перед точкой стоит имя объекта, для которого выделена память.
Поля структур ведут себя, как обычные переменные соответствующего типа, можно использовать поля в выражения, вводить данные с клавиатуры, передавать их функциям, получать адрес поля и так далее.
В структуре date под строку память выделяется в самой структуре, это приводит к созданию массива из 10 char-элементов для каждой переменной типа struct date, что весма неэкономично, так как строки вводимые с клавиатуры будут разной длины, а память выделяется всегда одна и та же. В следующем примере память под строку выделяется динамически. Структура имеет указатель на строку, память же под строку выделяется в процессе работы динамически после того, как становится известна длина строки.
Подробно схема работы с динамической строкой рассмотрена в файле:
Пример : создать структуру и выделить память под структурные переменные для хранения информации о товаре на складе. Каждая позиция склада содержит разнотипную информацию о товаре, например: название, цену, количество.
Создаем новый структурный тип struct tovar и выделяем память под переменную с именем food :
struct tovar
{
char* name ; / / наименование, указатель на строку
double price ;/ / цена
int vol ; / / количество
} food;
В следующем примере показано, как работать с полем структуры, которое является текстовой строкой, определенной через указатель.
#include <iostream>
using namespace std;
void main()
// определение структурного типа
{
struct tovar
{ char* name ;
double price ;
int vol ;
};
char buff[60]; //статический char-массив для ввода с клавиатуры
struct tovar meat;//определить структурную переменную meat
//_____________________________________________
// Занести информацию в поля переменной meat с клавиатуры
cout<<"Название:";
cin>>buff; // ввод строки c клавиатуры в переменную buff
//выделить динамическую память под строку
meat.name = new char[strlen(buff)+1];
strcpy(meat.name, buff); // копировать buff в динамическую память
cout<< "Цена: "); cin>>meat.price; // ввод поля «цена»
cout<<"Количество: "; cin>>meat.vol; // ввод поля «кол-во»
cout<<"_____________________________"<<endl;
cout<<"Название:"<<meat.name<<endl;
cout<<"Цена: "<<meat.price<<endl;
cout<<"Количество: "<<meat.vol<<endl;
}
Перечислим этапы работы с полями-строками, чтобы создать и заполнить с клавиатуры строку для названия товара, необходимо три этапа.
Во-первых информация вводится в промежуточную (статическую) строку buff, без этой дополнительной строки невозможно определить какой объем памяти запрашивать из кучи. Затем, с помощью оператора new выделяется необходимая динамическая память под уже известную текстовую строку. Затем информация из buff копируется в динамическую память с помощью функции strcpy().После того, как информация введена во все поля объекта meat, она выводится на экран терминала.
Контрольные вопросы
1. Приведите пример статического выделения памяти под переменную.
2. Приведите пример динамического выделения памяти под переменную.
3. В чем основное различие статического и динамического массива.
4. Какой оператор выделяет динамическую память, приведите пример.
5. Какой оператор освобождает динамическую память, приведите пример.
6. Перечислите последовательность действий при использовании структур.
7. Как выделить память под структурный объект?
8. Опишите два способа для обращения к полям структуры?