stringtranslate.com

структура (язык программирования C)

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

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

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

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

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

Тип данных struct в C был получен из типа данных struct ALGOL 68 . [2]

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

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

Декларация

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

struct tag_name { типmember1 ; _ введите член2 ; /* объявляем столько членов, сколько необходимо, но компилятору должен быть известен весь размер структуры. */ };       

tag_nameВ некоторых контекстах это необязательно .

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

typedef struct tag_name { typemember1 ; _ введите член2 ; } struct_alias ;        

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

Существует три способа инициализации структуры. Для structтипа

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

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

/* Определить переменную p типа point и инициализировать ее первые два элемента */ struct point p = { 1 , 2 };       

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

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

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

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

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

Назначение

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

структура точки { int x ; интервал y ; };      int main ( void ) { struct point p = { 1 , 3 }; /* инициализированная переменная */ struct point q ; /* не инициализировано */ q = p ; /* копируем значения членов из p в q */ return 0 ; }                    

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

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

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

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

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

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