Синтаксис: структуры в C и С++

Объявление структуры

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

struct Name
{
    type atrib;
    // остальные элементы структуры    
} structVar1, structVar2, ...;

где,

  • struct — ключевое слово, которое начинает определение структуры
  • Name — имя структуры
  • type — тип данных элемента структуры
  • atrib — элемент структуры
  • structVar1-2 — структурные переменные

Объявление структуры всегда должно начинаться с ключевого слова struct. Необязательно, чтобы структура имела имя, но тогда такая структура обязательно должна иметь структурные переменные, объявленные между закрывающей фигурной скобкой и точкой с запятой, строка 5. Обязательно в объявлении структуры должны присутствовать фигурные скобочки, они обрамляют тело структуры, в котором объявляются её атрибуты (элементы), строка 3. Структурные переменные, при объявлении структуры, указывать необязательно, строка 5.

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

struct_name structVariable;

Синтаксис объявления структуры в языке Си:

typedef struct name
{
    type atrib1;
    type atrib2;
    // остальные элементы структуры...
} newStructName structVar;

Синтаксис объявления структуры в языке Си предполагает два варианта. Первый, опустить ключевое слово typedef , при этом имя newStructName тоже не используется, и имя структуры, тогда обязательно необходимо при объявлении структуры использовать структурные переменные — structVar, строка 6. Смотрим пример:

struct name structVar;

Или вы можете воспользоваться typedef, для объявления псевдонима структуры newStructName, псевдоним:

newStructName structVar;

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

struct name *struct_instance; // указатель на структуру

Объявление указателя на структуру

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

В С++:

structName *structVar; // указатель на структуру structName

В Си:

newStructName *structVar;  // newStructName должно быть объявлено с typedef

или так, тоже для СИ:

struct name *structVar;

Доступ к элементам структуры

Доступ к элементам структуры так же прост, как использование символа «точка». Предположим. что у нас есть структурная переменная с именем car и у нее есть элемент с именем speed, к которому, мы сейчас получим доступ:

car.speed;
Примечание: такой способ доступа к элементам структуры работает только в том случае, когда структура не является указателем на структуру.

Доступ к элементам указателя на структуру

Чтобы получить доступ к элементам структуры, через указатель на структуру, вместо оператора «точка», используйте оператор стрелка ->:

carPtr->speed;

P.S.: Всем владельцам Android-смартфонов представляю хорошую подборку программ GPS навигаторов для android. В списке представлено около 20 программных продуктов, вы можете любой скачать и установить на свой девайс. Все программы абсолютно бесплатные.

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

Комментарии

  1. lnikaFax

    Работа в интернете

  2. Egor Zobnin

    Добрый день

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

    Я сделал так, но компилятор ругается

    typedef struct Basa_Configuration        //Настройка контроллера
    {
        CARD                localConf;
        ITZ                 tzBaza;
        RealTimeclock       timeRTC;
        uint16_t            counter_card;
        ROOLwork_state;
        char                Configuration[SIZE_CONFIGURATE];
    } BD_CONFIG;
    
    typedef enum WORK_STATE {    //Состояние работы программы
        PROGRAM_STATE,
        ROOL_OF_1,
        ROOL_OF_2
    } ROOL;
  3. KarDen.Mobie

    Сделал такую структуру:

    struct tEepromConfig {
    char SETTINGS_PRESENT; // Флаг наличия настроек. 0-настройки не сохранялись ни разу; 1-уже что-то сохранялось.
    char MODULE_NAME[32]; // Имя модуля
    char WIFI_MODE; // Режим работы WiFi: 1-точки доступа; 2-станция; 3-станция+репитер

    } EepromConfig, EepromConfigDefault;

     

    При обращении к переменным с префиксом EepromConfig — проблем нет, а при обращении к переменным с префиксом EepromConfigDefault — ругается компилятор

    ‘EepromConfigDefault’ does not name a type

    Что не так? Спасибо

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

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