Другое

Структуры в Си: конструктор, массивы и указатель на структуру

Lorem ipsum dolor

Структуры в Си произвольный тип данных, который объединяет разные типы данных под одним именем. Главное отличие от массивов в Си:

  • в массиве располагаются только одинаковые типы данных;

  • в структуре располагаются разные типы данных.

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

  • автомобиль: привод, вид топлива, количество дверей, объем двигателя, марка и др.;

  • товар на полке магазина: штрих-код, группа, наименование, вес и др.;

  • квартира: количество комнат, этажность, площадь, качество ремонта и др.;

  • человек: пол, рост, вес, идентификационные данные, образование и др.

Так будет с каждым объектом. Поезд обладает своим набором свойств, велосипед своим, хлеб своим и т. д. Количество свойств у объекта может быть очень большим, однако не всегда важны все свойства. Есть такие, которые имеют принципиальное значение. Например, при приеме на работу важны навыки, образование, опыт, а не цвет волос или предпочтения в еде.

Структуры в Си нужны как раз для того, чтобы формировать конструкции с важными свойствами объекта. Например, при приеме кандидатов на работу лучше формировать структуру данных по каждому кандидату, а не массив.

Структуры в Си

Для объявления структуры в С используют специальное слово «struct». А шаблон объявления выглядит таким образом:

struct <имя структуры> {

    <состав структуры>

};

 

где:

  • имя структуры создается в свободном порядке,

  • состав структуры описывает все компоненты, входящие в «struct».

На деле это выглядит так:

struct worker {

    int age;

    char *firstname;

    char *gender;

};

 

То есть мы создали структуру «worker», в которой располагается 3 важных для нас свойства:

  • age является типом данных «int» и обозначает возраст;

  • firstname является указателем на тип данных «char» и обозначает имя;

  • gender является указателем на тип данных «char» и обозначает гендерную принадлежность.

Каждый компонент структуры объявляется как стандартная переменная, но в отличии от стандартной переменной нет возможности их инициализировать или выделить для них оперативную память компьютера. Это означает, что мы как бы «объявляем» новый тип данных, который пока пустой.

После того как структура объявлена, она становится доступной для использования. Но вначале ее нужно как-то представить, то есть создать переменную, которая будет ее определять. Например:

struct worker tihon;

 

тут мы определили переменную «tihon», которая представляет структуру «worker»

Теперь, когда мы будем объявлять переменную «tihon», ей будет выделена память для сохранения ее компонентов. Кстати, такую переменную можно инициализировать, задав ей необходимые значения. Например:

struct worker tihon = {28, "Тихон", "мужчина"};

 

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

Что такое массив структур С

Структуры в Си очень гибкие, поэтому их можно применять в разных местах. Например, можно создать массив структур. Причем создание массива из структур ничем не отличается от создания массива с другими типами данных. Например:

struct worker staff_member[15];

 

То есть мы определили массив структур «worker» из 15 компонентов«staff_member».

Предлагаем посмотреть массив структур в небольшой программке:

#include <stdio.h>

 struct worker 

{

    int age;

    char firstname[30];

};

 

int main(void)

{

    struct worker staff_member[] = {28, "Тихон", 34, "Дормидонт", 29, "Владлен", 48, "Анфиса"};

    int n = sizeof(staff_member)/sizeof(staff_member[0]);

    for(int i=0; i<n; i++)

    {

        printf("Имя:%s \t Возраст: %d \n", staff_member[i].firstname, staff_member[i].age);

    }

    return 0;

}

 

Важно отметить, что у нас в массиве создано 4 объекта «staff_member». У каждого объекта по 2 элемента, поэтому при инициализации будет передано 8 значений. Но так как обращение идет к структуре, значит, будет определено, что в массиве структур С будет всего 4 объекта «staff_member», а не 8.

Массив структур в Си позволяет использовать указатель на структуру. Например:

struct worker 

{

    int age;

    char firstname[30];

};

 

int main(void)

{

    struct worker staff_memeber[] = {28, "Тихон", 34, "Дормидонт", 29, "Владлен", 48, "Анфиса"};

     

    int n = sizeof(staff_memeber)/sizeof(staff_memeber[0]);

     

    for(struct worker *s=staff_memeber; s < staff_memeber+n; s++)

    {

        printf("Имя:%s \t Возраст: %d \n", s->firstname, s->age);

    }

    return 0;

}

 

В массиве «worker» расположены все те же объекты, однако для их просмотра мы создали указатель «*s».

Заключение

Структуры в Си используются для того, чтобы удобнее было оперировать разными типами данных одного объекта. С каждой отдельной структурой можно работать как с определенным типом данных. Например, как мы показали в статье, можно создать массив структур в С, а далее работать со структурами как с обычными компонентами массива.

Схожие статьи

Что такое роутинг или маршрутизация простыми словами для чайников
Другое

Что такое роутинг или маршрутизация простыми словами для чайников

Angular и AngularJS: в чем разница между этими двумя фреймворками?
Другое

Angular и AngularJS: в чем разница между этими двумя фреймворками?

Основные направления развития ИТ и как успеть ворваться в эту сферу
Другое

Основные направления развития ИТ и как успеть ворваться в эту сферу

Google Firebase: что это за сервис и для чего его можно использовать
Другое

Google Firebase: что это за сервис и для чего его можно использовать