Структура. Мы будем использовать взаимозаменяемые термины запись и структура. Структуры позволяют программистам при разработке совокупности данных для спецификации, использовать другие основные типы данных. Это позволяет им следить за сложной информацией, которая может содержать различные типы данных. Например, если вы разрабатываете систему описи для автомобильного торгового агента, вы могли бы разработать следующую структуру основных данных для конкретного автомобиля, таких, как год выпуска, изготовитель, модель, номер идентификации транспортного средства (VIN), и прогон, как показано на рис. 8.4.
Рис. 8.4.Запись для автомобиля. Запись содержит поля данных, совокупность которых описывает автомобиль
Каждый из типов данных в записи называется полем. Мы объявляем запись или структуру, используя следующий синтаксис:
struct car {
int year; /* год производства* /
char make[10]; /*BWM, Hummer, Saturn */
char model[12]; /*купе, обратимый, SUV, пикап */
char VIN[10]; /* комбинация цифр, букв */
float mileage; /*показания счетчика: от 0 до 500,000+ */
struct car *next; /*указатель на следующий автомобиль в списке*/
};
/*typedef обеспечивает компилятор an alternate???*/
typedef struct car ELEMENT; /*для типа переменной */
typedef ELEMENT *car_temp_ptr; /*определяет указатель на автомобиль*/
Как можно видеть, все поля записи описывают различные параметры данного автомобиля. Мы привели сокращенный список параметров. Структура может содержать столько полей, сколько необходимо. Мы выбрали для каждого поля тот тип данных, который наиболее подходит для описания каждого параметра автомобиля.
Структуры создаются с использованием динамических методов распределения памяти. Как мы уже упоминали, команда malloc()
— предоставляет методику динамического распределения памяти, определяя соответствующий объем памяти для структуры данных. Например, чтобы создать новую запись для автомобиля, можно использовать следующий код:
сar_temp_ptr new_car_entry;
new_car_entry = (car_temp_ptr)malloc(sizeof(ELEMENT));
В главе 3, мы описали, как обращаться к различным полям внутри записи. В этом примере, мы инициализируем недавно созданную автомобильную запись с информацией о конкретном автомобиле. Обратите внимание, что мы использовали оператор –>
, чтобы обратиться к специфическому полю внутри структуры.
/* инициализация новых полей для структуры car */
new_car_entry–>year = 1981; /* год производства */
strcpy(new_car_entry–>make, "Chevy"); /*BWM, Hummer, Saturn */
strcpy(new_car_entry–>model, "Camaro"); /*купе, обратимый, SUV, пикап */
strcpy(new_car_entry–>VIN, " 12Z3 67"); /* комбинация цифр, букв*/
new_car_entry–>mileage = 37456; /*показания спидометра: от 0 до 500,000+ */
new_car_entry–>next = NULL; /* определяет указатель на автомобиль */
Чтобы распечатать различные поля записи, мы могли бы использовать следующий код:
printf("\nyear: %4d ", new_car_entry–>year); / *year mfg */
printf("\nmake: %s ", new_car_entry–>make); /*car делает */
printf("\nmodel: %s ", new_car_entry–>model); /*model*/
printf("\nVIN: является ", new_car_entry–>VIN); /*VIN */
printf("\nMileage: %6.of ", new_car_entry –> mileage); /*odometer reading*/
Поместим все эти части вместе с примером. Мы убедительно просим вас компилировать и выполнить этот код.
#include /*стандартные входные/выходные функции*/
#include /*библиотека и распределение памяти */
void main(void) {
/*определение структуры */
struct car;
int year; /*год выпуска */
char make[10]; /*BWM, Hummer, Saturn*/
char model[12]; /*купе, обратимый, SUV, пикап */
char VIN[10]; /*комбинация цифр и букв*/
float mileage; /*показания одометра: от 0 до 500 000+ */
struct car *next; /*указатель на следующий автомобиль в списке */
typedef struct car ELEMENT;
typedef ELEMENT *car_temp_ptr;
car_temp_ptr new_car_entry; /*ввод записи для автомобиля*/
new_car_entry = (car_temp_ptr)malloc(sizeof(ELEMENT));
/*инициализация новых полей для автомобиля */
new_car_entry->year = 1981; /*год изготовления*/
strcpy(new_car_entry–>make, "Chevy"); /*BWM, Hummer, Saturn */
strcpy(new_car_entry–>model,"Camaro");
/* купе, обратимый, SUV, пикап */
strcpy(new_car_entry–>VIN, "12Z3 67");
/* комбинация цифр и букв */
new_car_entry–>mileage - 37456;/*показания одометра: 0 to 500,000+*/
new_car_entry–>next - NULL; /*указатель на следующий автомобиль в списке*/
printf("\nyear: %4d", new_car_entry–>year); /*год выпуска */
Читать дальше