1. Определение типа структуры
Способ определения 1:
Typedef struct LNode {
int data; // 数据域
struct LNode *next; // 指针域
} *LinkList;
Способ определения 2:
struct LNode {
int data; // 数据域
struct LNode *next; // 指针域
};
Typedef struct LNode *LinkList;
Два приведённых выше способа определения эквивалентны, то есть определить*LinkListкакstruct LNodeтип, то естьLinkListопределяется как имя типа. Таким образом, вы можете использоватьLinkListдля определения и объявления новых переменных, например:
LinkList L;
то есть определитьLопределяемую какstruct LNodeпеременную-указатель этого типа.
2. Определение переменной типа структуры
Способ определения 1:
struct LNode {
int data; // 数据域
struct LNode *next; // 指针域
}LnodeA;
Способ определения 2:
struct LNode {
int data; // 数据域
struct LNode *next; // 指针域
};
struct LNode LnodeA;
Два приведённых выше способа определения также эквивалентны; таким образом, определяютLnodeAкакstruct LNodeпеременную этого типа, то естьLnodeAкак имя переменной типаstruct LNode.
Способы определения структур и внутренних таблиц
1. Структура, область прозрачной таблицы, ЭЛЕМЕНТ ДАННЫХ, ДОМЕН
Прозрачная таблица — это логическое описание физической таблицы. Прозрачная таблица содержит много полей, и некоторые поля определены как ПЕРВИЧНЫЙ КЛЮЧ. Поля также содержат ЭЛЕМЕНТ ДАННЫХ, который используется для описания языковых и технических атрибутов. ЭЛЕМЕНТ ДАННЫХ также содержит ДОМЕН, который определяет тип данных и длину поля.
Структура обычно используется для определения структурной переменной, с хранением временных данных, и не имеет ПЕРВИЧНОГО КЛЮЧА. Структура содержит КОМПОНЕНТ, а не ПОЛЕ.
2. Атрибуты внутренней таблицы делятся на три типа: ТИП СТРОКИ, КЛЮЧ, ВИД ТАБЛИЦЫ.
ТИП СТРОКИ: отдельная строка во ВНУТРЕННЕЙ ТАБЛИЦЕ называется ТИП СТРОКИ, и структура каждой строки одинакова.
КЛЮЧ: эквивалентен первичному ключу в базе данных. Он полезен при сортировке, УНИКАЛЬНЫЙ или НЕУНИКАЛЬНЫЙ.
ВИД ТАБЛИЦЫ: делится на СТАНДАРТНАЯ, СОРТИРОВАННАЯ, ХЕШИРОВАННАЯ.
Определение трех типов внутренних таблиц
Стандартная таблица:
DATA itab1 TYPE STANDARD TABLE OF scarr WITH NON-UNIQUE KEY carrid.
Сортированная таблица:
DATA itab2 TYPE SORTED TABLE OF scarr WITH NON-UNIQUE KEY carrid.
Хешированная таблица:
DATA itab3 TYPE HASHED TABLE OF scarr WITH UNIQUE KEY carrid.
Общий метод определения (стандартная таблица)
Определить стандартную таблицу на основе таблицы базы данных
DATA itab4 TYPE TABLE OF scarr.
Определить стандартную таблицу на основе самостоятельно определённой структурной переменной (наиболее распространённый вариант)
DATA: BEGIN OF wa,
carrid TYPE scarr-carrid,
carrnamen TYPE scarr-carrname,
END OF wa.
DATA itab5 LIKE TABLE OF wa.
Определить стандартную таблицу на основе табличного типа в словаре данных
DATA itab6 TYPE ztabtype00_1.
Определить внутреннюю таблицу на основе внутренней таблицы
DATA itab7 LIKE itab6.
Определить структуру на основе внутренней таблицы
DATA wa1 LIKE LINE OF itab7.
3. Способы определения структуры
Определить структурную переменную (или тип) программы на основе таблицы или структуры в словаре данных
types str1 type spfli. data str2 type sflight.
Самостоятельно определить структурную переменную (или тип) в программе — наиболее распространённый вариант
data: begin of wa, carrid type spfli-carrid, com(10) type c, end of wa.
Определить структуру на основе внутренней таблицы
data wa like line of itab.
Примечание:То, что определяется на основе таблицы базы данных, должно быть структурой
Присваивание полей с одинаковыми именами (важно)
Move-corresponding A to B.
READ — это чтение одной записи из внутренней таблицы
read table itab like table of wa.
Чтобы прочитать несколько записей из внутренней таблицы, используйте LOOP
loop at itab into wa.
Объяснение на языке C/C++
Определение структуры
Структура (struct) — это набор данных, состоящий из ряда данных одного и того же или разных типов, также называемый структурой.
Назначение структур
Структура подобна другим базовым типам данных, таким как тип int, тип char; только структуру можно превратить в нужный вам тип данных, чтобы облегчить дальнейшее использование.
В реальных проектах структуры встречаются в большом количестве. Сотрудники НИОКР часто используют структуры для инкапсуляции некоторых свойств, чтобы сформировать новые типы.
Роль структур в функциях — не удобство; её основная роль — инкапсуляция. Преимущество инкапсуляции в том, что её можно повторно использовать. Она позволяет пользователям не заботиться о том, что это такое, а просто использовать это согласно определению.
Размер структур и выравнивание памяти
Размер структуры не является просто суммой её элементов, потому что в современных массовых компьютерах, которые мы используем, процессоры имеют 32-битную разрядность слова. Для процессоров этого типа чтение числа размером 4 байта эффективнее и удобнее, чем чтение одного байта. Поэтому, если первый адрес каждого члена структуры кратен 4, выборка элементов данных будет относительно эффективнее. Это и есть причина выравнивания памяти.
Компилятор на каждой конкретной платформе имеет свой собственный «коэффициент выравнивания» по умолчанию (также называемый модулем выравнивания). Программисты могут использовать команду прекомпиляции#pragma pack(n),n=1,2,4,8,16, чтобы изменить этот коэффициент, где n — это «коэффициент выравнивания», который вы хотите задать.
Правила:
- 1. Правило выравнивания элементов данных: для элементов данных структуры (struct) (или объединения) первый элемент данных размещается со смещением 0, а каждый последующий элемент данных выравнивается в соответствии с#pragma packменьшим из заданного значения и длины самого элемента данных.
- 2. Общее правило выравнивания структуры (или объединения): После того как каждый член данных завершил собственное выравнивание, сама структура (или объединение) также должна быть выровнена. Выравнивание будет основываться на< span class="marked">#pragma pack меньшем из указанного значения и длины наибольшего члена данных в структуре (или объединении).
- 3. Объединяя 1 и 2, можно сделать вывод: когда значение n в #pragma pack равно или превышает длины всех членов данных, размер этого значения n не будет иметь никакого эффекта.
Структуры в C++
В языке C можно определять типы структур, чтобы упаковывать несколько связанных переменных как единое целое. Переменные в структуре могут быть одного, частично одного или полностью разных типов данных. В языке C структуры не могут содержать функции. В объектно-ориентированном программировании объекты имеют состояние (атрибуты) и поведение; состояние хранится в переменных-членах, а поведение реализуется через методы-члены (функции). Структуры в C могут описывать только состояние объекта, но не поведение объекта. В C++, учитывая преемственность перехода от C к C++, структуры были расширены. Структуры в C++ могут содержать функции, поэтому структуры в C++ также обладают функциональностью классов. В отличие от class, функции, содержащиеся в структуре, по умолчанию являются public, а не private.
Пример вывода в консоль на C++:
Пример
Различия между структурами и классами в C++
В C++ классы и структуры различаются лишь в двух отношениях; в остальном различий нет.
- (1) Уровень доступа к членам по умолчанию в class — private, а в struct — public.
- (2) Наследование от class по умолчанию private, а наследование от struct по умолчанию public.
В чём разница между этими двумя определениями?
typedef struct student
{
int num;
struct student *next;
}student;
struct student
{
int num;
struct student *next;
};
Второе "struct student" определяет структуру student, вы это понимаете?
Первое использует typedef, чтобы переопределить имя типа структуры "struct student" как "student". То есть "struct student" и "student" обозначают одно и то же и оба являются идентификаторами типа. Например, "typedef int zhengshu;" переименовывает целочисленный тип int в zhengshu. Следующие определения: "int i;" и "zhengshu i;" эквивалентны.
Структура — это объединение различных переменных, которые состоят из базовых типов данных и именуются идентификатором. В структуре можно использовать разные типы данных.
Объявление структуры и определение переменной структуры
В Turbo C структура также является типом данных, и можно использовать переменные структуры. Поэтому, как и переменные других типов, переменные структуры должны быть определены перед использованием.
Общий формат определения переменной структуры:
struct 结构名
{
类型 变量名;
类型 变量名;
...
} 结构变量;
Имя структуры — это идентификатор структуры, а не имя переменной.
Типы — это пять типов данных, описанных в разделе 2 (целочисленный, с плавающей точкой, символьный, указатель и void).
Каждая переменная типа, входящая в структуру, называется элементом структуры. Она подобна элементу массива, но к элементам массива обращаются по индексам, тогда как в структурах доступ к элементам осуществляется по именам переменных.
Ниже приведён пример, иллюстрирующий, как определить переменную структуры.
struct string
{
char name[8];
int age;
char sex[4];
char depart[20];
float wage1,wage2,wage3;
}person;
В этом примере определяется переменная структуры "person" с именем структуры "string". Если имя переменной "person" опущено, это становится объявлением структуры. Уже объявленное имя структуры также можно использовать для определения переменных структуры. При таком определении предыдущий пример принимает вид:
struct string
{
char name[8];
int age;
char sex[4];
char depart[20];
float wage1,wage2,wage3;
};
struct string person;
Если нужно определить несколько переменных структуры одинаковой формы, этот способ удобнее. Сначала объявляется структура, затем с помощью имени структуры определяются переменные.
Например:
struct string Tianyr, Liuqi, ...;
Если имя структуры опущено, она называется анонимной структурой. Такая ситуация часто встречается внутри функций. При использовании такой структуры предыдущий пример принимает вид:
struct
{
char name[8];
int age;
char sex[4];
char depart[20];
float wage1,wage2,wage3;
} Tianyr, Liuqi;
Использование переменных структуры
Структура — это новый тип данных, поэтому переменные структуры можно присваивать и выполнять над ними операции так же, как с переменными других типов. Отличие в том, что в переменных структуры в качестве базовых переменных используются элементы.
Представление элементов структуры:
structure variable.member name
Если рассматривать выражение «переменная структуры.имя элемента» как единое целое, тип данных этого целого совпадает с типом данных соответствующего элемента в структуре, поэтому его можно использовать так же, как переменные, описанные ранее.
В следующем примере определяется переменная структуры, каждый элемент которой получает данные с клавиатуры, затем суммируются числа с плавающей точкой в структуре и выводится результат. Обратите внимание на доступ к различным элементам структуры в этом примере.
Пример
Массивы структур и указатели на структуры
Структура — это новый тип данных, и она также может иметь массивы структур и указатели на структуры.
1. Массивы структур
Массив структур — это набор переменных с одним и тем же типом структуры. Например, чтобы определить имена, пол, возраст и адреса 40 студентов в классе, вы можете определить это как массив структур. Как показано ниже:
struct
{
char name[8];
char sex[4];
int age;
char addr[40];
}student[40];
Его также можно определить как:
struct string
{
char name[8];
char sex[4];
int age;
char addr[40];
};
struct string student[40];
Следует отметить, что при доступе к членам массива структур элемент массива рассматривается как переменная структуры, и его форма такова:
structure array element.member name
Например:
student[0].name student[30].age
Фактически, массив структур эквивалентен двумерной структуре. Первое измерение — это элементы массива структур, каждый элемент является переменной структуры, а второе измерение — это члены структуры.
Примечание: Члены массива структур также могут быть переменными массива.
Например:
struct a
{
int m[3][5];
float f;
char s[20];
}y[4];
Для доступа к переменной структуры в структуре ay[2]эту переменную можно записать какy[2].m[1][4]
2. Указатели на структуры
Указатель на структуру — это указатель на структуру. Он определяется оператором *, помещённым перед именем переменной структуры. Например, используйте описанную ранее структуру, чтобы определить указатель на структуру следующим образом:
struct string
{
char name[8];
char sex[4];
int age;
char addr[40];
}*student;
Можно также опустить имя указателя на структуру и сделать только объявление структуры, затем использовать следующий оператор для определения указателя на структуру.
struct string *student;
Использование указателя на структуру для доступа к членам структуры отличается в выражении от использования переменной структуры для доступа к членам структуры. Доступ к членам структуры через указатель на структуру выражается так:
structure pointer name->structure member
где->— это два символа-и>объединённые, как стрелка, указывающая на член структуры. Например, чтобы присвоить значения name и age в определённой выше структуре, можно использовать следующие операторы:
strcpy(student->name, Lu G.C); student->age=18;
На самом деле,student->nameявляется(*student).nameсокращением.
Следует отметить, что указатель на структуру — это указатель на структуру, то есть первый адрес первого члена в структуре. Поэтому перед использованием указатель на структуру следует инициализировать, то есть выделить область памяти размером во всю длину структуры. Это можно сделать с помощью следующей функции, по-прежнему используя предыдущий пример для иллюстрации следующим образом:
student=(struct string*)malloc(size of (struct string));
size of (struct string)Автоматически получает длину в байтах структуры string. Функция malloc() определяет область памяти размером с длину структуры, а затем возвращает её первый адрес в качестве указателя на структуру.
Примечание:
- 1. Структура — это тип данных, поэтому определённые переменные структуры или переменные-указатели на структуру также бывают локальными и глобальными переменными, в зависимости от того, где они определены.
- 2. Имя переменной структуры не является адресом, указывающим на структуру, что отличается от значения имени массива. Поэтому, если вам нужно найти первый адрес первого члена структуры, следует использовать&[имя переменной структуры]。
- 3. Сложная форма структуры: вложенные структуры
Вложенная структура означает, что член структуры может включать другую структуру. Turbo C допускает такую вложенность.
Например: ниже представлена структура с вложением
struct string
{
char name[8];
int age;
struct addr address;
} student;
Здесь: addr — это имя другой структуры, и она должна быть объявлена первой, то есть
struct addr
{
char city[20];
unsigned lon zipcode;
char tel[14];
}
Если вы хотите присвоить значение zipcode в структуре address, которая является членом структуры student, можно написать:
student.address.zipcode=200001;
Каждое имя члена структуры перечисляется одно за другим от самого внешнего слоя к самому внутреннему, то есть выражение для членов вложенной структуры имеет вид:
structure variable name.nested structure variable name.structure member name
Вложенных структур может быть много, и имя члена структуры — это имя члена во внутренней структуре, который не является структурой.
Ссылка на оригинал: https://www.cnblogs.com/yuxinJ/p/4688496.html