Структуры в языке С

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

Давайте представим телефонный справочник в виде структуры, то есть в структуре должна храниться вся необходимая информацию о каждом человеке — имя, адрес, номер телефона, и так далее. Синтаксис объявления структуры:

struct /*имя структуры*/ {
  /*переменные-члены структуры*/
};

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

struct home {
  int rooms;
};
struct home home1; // объявляем структуру как обычную переменную, просто вначале дописываем слово struct

home1.rooms = 4;          //вот так получаем доступ к переменной

Тут все предельно ясно. Давайте рассмотрим еще один пример программы:

struct database {
  int rowId;
  int name;
  float surname;
};

int main()
{
  struct database worker;  // объявили переменную-структуру

  worker.rowId = 1;
  worker.name = Denis;
  worker.surname = Sukhoverkhov;
}

Структура с именем database имеет три переменные, rowId, name, surname. Структуру database можно использовать как тип данных для переменной, пример показан в строке 9. Мы создали переменную worker типа database. И теперь, через переменную worker мы можем получить доступ к элементам структуры. Мы можем задать номер строки, имя и фамилию. Доступ к элементам структуры осуществляется через точку. То есть, чтобы поменять значение структуры или считать его, достаточно указать имя перемененной и через точку — элемент структуры. Вы также можете вернуть структуру в качестве возвращаемого значения функции, для этого нужно определить тип возвращаемого значения функции в качестве структурного типа. Например:

struct database functionName();

Немного подниму тему объединений — union, по сути это все та же структура, за исключением того, что все переменные занимают один и тот же объем памяти. Когда в программе объявляется union, компилятор выделяет достаточно памяти для крупнейшего типа данных в объединении. Это как огромное хранилище, в котором есть одна большая запись, все остальные — маленькие, и этим маленьким записям никогда не понадобится в полном объеме то место, которое им отводится.
Оператор точка "." также используется и для доступа к элементам объединения — union. В качестве последнего замечания, хочу отметить такой момент, если вы работаете со структурой через указатель, то в качестве оператора доступа к элементам структуры нужно использовать оператор ->, вместо оператора ".". Все остальное остается актуальным и для указателей.

#include <stdio.h>

struct instance {
  int var;
};

int main()
{  
    struct instance instance1;
    struct instance *ptrStruct;

    instance1.var = 12;
    ptrStruct = &instance1; // указатель на структуру

    printf( "%d\n", ptrStruct->var );  // работает как оператор разименования - *
    getchar();
}

Вот результат работы программы:

CppStudio.com
12

Если у вас возникнут какие-то вопросы, задавайте их в комментариях или на форуме.

P.S: Если у вас компьютер стал медленнее работать или объем жесткого диска резко увеличился без всякой причины, значит, скорее всего на вашей машине насобиралось очень много временных файлов. Удалить их всех вам поможет программа ccleaner, скачать её можно на этом сайте — ccleaner4you.ru. После чистки, ваш компьютер заметно станет работать быстрее, кроме того, освободится немало места на жестком диске.

Практика

К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!

Автор: Marienko L.
Дата: 31.01.2014
Поделиться:

Комментарии

  1. Sergiy Vovk

    Добавте в посібник:

    Елементи union ніби накладаються на один одного і мають однакову адресу.

    Приклад:

    union { long l; int i; double d; } a;
    // Змінна a та її елементи мають однакову адресу.
    cout << "  a address: " << &a << endl;
    cout << "a.l address: " << &a.l << endl;
    cout << "a.i address: " << &a.i << endl;
    cout << "a.d address: " << &a.d << endl;

    Одночасно можна використовувати лише один елемент union тому що зміна значення одного елементу приведе до зміни значень інших елементів.

    union можна використовувати для економії пам’яті.

  2. Mistico_Ukraine

    Mistico_Ukraine

    #include <stdio.h>
    
    struct database {
        int rowId;
        char *name;
        char *surname;
    };
    
    int main()
    {
        struct database worker;  // объявили переменную-структуру
        worker.rowId = 1;
        worker.name ="Denis";
        worker.surname = "Sukhoverkhov";
        printf ("%d\n", worker.rowId);
        printf ("%s\n", worker.name );
        printf ("%s\n", worker.surname);
    }
  3. Alex_Gates

    Alex_Gates

    Спасибо. Все круто понятно с примерами. Молодци идеально просто )

    while (true)

    {

    respect (cppstudio);

    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.