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

редактировать

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

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

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

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

СОДЕРЖАНИЕ

  • 1 На других языках
  • 2 Декларация
  • 3 Инициализация
  • 4 Назначение
  • 5 указателей на структуру
  • 6 См. Также
  • 7 ссылки

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

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

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

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

Декларация

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

struct tag_name { type member1; type member2; /* declare as many members as desired, but the entire structure size must be known to the compiler. */ };

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

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

typedef struct tag_name { type member1; type member2; } struct_alias;

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

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

/* Declare the struct with integer members x, y */ struct point { int x; int y; };

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

/* Define a variable p of type point, and initialize its first two members in place */ struct point p = { 1, 2 };

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

/* Define a variable p of type point, and set members using designated initializers*/ struct point p = {.y = 2,.x = 1 };

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

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

/* Define a variable q of type point, and set members to the same values as those of p */ struct point q = p;

Назначение

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

struct point { int x; int y; }; int main(void) { struct point p = { 1, 3 }; /* initialized variable */ struct point q; /* uninitialized */ q = p; /* copy member values from p into q */ return 0; }

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

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

struct point { int x; int y; }; struct point my_point = { 3, 7 }; struct point *p = amp;my_point; /* p is a pointer to my_point */ (*p).x = 8; /* set the first member of the struct */ p-gt;x = 8; /* equivalent method to set the first member of the struct */

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

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

Последняя правка сделана 2024-01-08 04:39:02
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте