Struct (язык программирования C) - Struct (C programming language)

А структура в Язык программирования C (и многие производные) является составной тип данных (или же записывать ), которое определяет физически сгруппированный список переменных под одним именем в блоке памяти, позволяя получить доступ к различным переменным через один указатель или по объявленному имени структуры, которое возвращает тот же адрес. Тип данных struct может содержать другие типы данных, поэтому используется для записей смешанного типа, таких как запись каталога жесткого диска (длина файла, имя, расширение, физический адрес и т. Д.) Или других записей смешанного типа (имя , адрес, телефон, баланс и т. д.).

Структура C напрямую ссылается на смежный блок физической памяти, обычно ограниченной (размерной) границами длины слова. Это соответствует одноименной функции, доступной в некоторых монтажники для процессоров Intel. Будучи блоком непрерывной памяти, каждое поле в структуре расположено с определенным фиксированным смещением от начала.

Поскольку содержимое структуры хранится в непрерывной памяти, размер оператор должен использоваться для получения количества байтов, необходимых для хранения структуры определенного типа, точно так же, как он может использоваться для примитивы. Выравнивание определенных полей в структуре (относительно слово границ) зависит от реализации и может включать заполнение, хотя современные компиляторы обычно поддерживают #pragma pack директива, которая изменяет размер в байтах, используемых для выравнивания.[1]

в C ++ язык, структура идентична Класс C ++ но имеет другую видимость по умолчанию: члены класса по умолчанию являются закрытыми, тогда как члены структуры по умолчанию являются общедоступными.

На других языках

Тип данных struct в C был получен из АЛГОЛ 68 тип данных структуры.[2]

Как и его аналог C, тип данных struct в C # (Структура в Visual Basic .NET ) похож на учебный класс. Самая большая разница между структурой и классом в этих языках заключается в том, что когда структура передается в качестве аргумента функции, любые изменения структуры в этой функции не будут отражены в исходной переменной (если только передача по ссылке не использовал).[3]

Это отличается от C ++, где классы или структуры могут выделяться статически или динамически выделяться либо в стеке (аналогично C #), либо в куче с явным указателем. В C ++, единственная разница между структурой и учебный класс состоит в том, что члены и базовые классы структуры общественный по умолчанию. (Класс, определенный с помощью учебный класс ключевое слово имеет частный члены и базовые классы по умолчанию.)

Декларация

Общий синтаксис объявления структуры в C:

структура название тэга {   тип member1;   тип member2;   / * объявляем столько членов, сколько нужно, но компилятору должен быть известен полный размер структуры. * /};

Здесь название тэга не является обязательным в некоторых контекстах.

Такой структура декларация может также появляться в контексте typedef объявление псевдонима типа или объявление или определение переменной:

typedef структура название тэга {   тип member1;   тип member2;} struct_alias;

Инициализация

Есть три способа инициализировать структуру. Для структура тип

/ * Объявить структуру с целыми членами x, y * /структура точка {   int    Икс;   int    y;};

Инициализаторы в стиле C89 используются, когда могут быть заданы смежные члены.[4]

/ * Определение переменной p типа point и инициализация ее первых двух членов на месте * /структура точка п = { 1, 2 };

Для несмежных или неупорядоченных списков участников, назначенный инициализатор стиль[5] может быть использовано

/ * Определяем переменную p типа point и устанавливаем члены с помощью назначенных инициализаторов * /структура точка п = { .y = 2, .Икс = 1 };

Если указан инициализатор или объект статически распределенный, пропущенные элементы инициализируются значением 0.[6]

Третий способ инициализации структуры - скопировать значение существующего объекта того же типа.

/ * Определить переменную q типа point и установить для членов те же значения, что и у p * /структура точка q = п;

Назначение

Структура может быть назначена другой структуре. Компилятор может использовать memcpy () выполнить такое задание.

структура точка {    int Икс;    int y;};int главный(пустота){    структура точка п = { 1, 3 };        / * инициализированная переменная * /    структура точка q;                   / * неинициализировано * /    q = п;                     / * копируем значения членов из p в q * /    возвращаться 0;}

Указатели на структуру

Указатели могут использоваться для ссылки на структура по его адресу. Это полезно для передачи структур в функцию. Указатель может быть разыменованный с использованием * оператор. В -> Оператор разыменовывает указатель на структуру (левый операнд), а затем получает доступ к значению члена структуры (правый операнд).

структура точка {   int Икс;   int y;};структура точка моя точка зрения = { 3, 7 };структура точка *п = &моя точка зрения;  / * p - указатель на my_point * /(*п).Икс = 8;                   / * устанавливаем первый член структуры * /п->Икс = 8;                     / * эквивалентный метод для установки первого члена структуры * /

Смотрите также

Рекомендации

  1. ^ «Структурированная разметка памяти на C». Переполнение стека.
  2. ^ Ричи, Деннис М. (Март 1993 г.). «Развитие языка Си». Уведомления ACM SIGPLAN. 28 (3): 201–208. Дои:10.1145/155360.155580. Схема набора шрифтов, принятая в Си, в значительной степени обязана Алголу 68, хотя, возможно, она не возникла в той форме, которую одобрили бы приверженцы Алгола. Центральным понятием, которое я уловил из Алгола, была структура типа, основанная на атомарных типах (включая структуры), составленных в массивы, указатели (ссылки) и функции (процедуры). Концепция объединений и приведений в Алголе 68 также оказала влияние, появившееся позже.CS1 maint: ref = harv (связь)
  3. ^ «Передача параметров в C #».
  4. ^ Келли, Ал; Поль, Ира (2004). Книга на C: Программирование на C (Четвертое изд.). стр.418. ISBN  0-201-18399-4.
  5. ^ «Компиляторы IBM Linux. Инициализация структур и объединений».
  6. ^ "Новый стандарт C, инициализация §6.7.8".