Разница между структурой и объединением
Содержание
C ++ допускает все пять способов, которые предоставляет язык C для создания пользовательских данных. Этими пятью способами являются «структура», «битовое поле», «объединение», «перечисление», «определение типа». В статье ниже мы собираемся изучить разницу между структурой и объединением. Структура и объединение - это типы данных контейнера, которые могут содержать данные любого «типа». Одно существенное отличие, которое отличает структуру и объединение, состоит в том, что структура имеет отдельную ячейку памяти для каждого из своих членов, тогда как члены объединения разделяют одну и ту же ячейку памяти.
Давайте поймем разницу между структурой и объединением, а также сравнительную таблицу.
- Сравнительная таблица
- Определение
- Ключевые отличия
- сходства
- Вывод
Сравнительная таблица
Основа сравнения | Состав | союз |
---|---|---|
основной | Отдельная ячейка памяти выделена каждому члену структуры. | Все члены союза имеют одну и ту же ячейку памяти. |
декларация | struct имя_структуры { тип element1; тип element2; . . } переменная1, переменная2, ...; | union u_name { тип element1; тип element2; . . } переменная1, переменная2, ...; |
ключевое слово | структура | союз |
Размер | Размер структуры = сумма размера всех элементов данных. | Размер союза = размер крупнейших членов. |
Стоимость магазина | Хранит различные значения для всех членов. | Хранит одинаковое значение для всех участников. |
Вовремя | Структура хранит несколько значений различных членов структуры. | Союз хранит одно значение за раз для всех членов. |
Способ просмотра | Предоставьте один способ просмотра каждой ячейки памяти. | Предоставить несколько способов просмотра одной и той же области памяти. |
Анонимная функция | Нет анонимной функции. | Анонимный союз может быть объявлен. |
Определение структуры
Структура представляет собой набор переменных разных типов данных, которые называются общим именем. Переменные в структуре называются «членами». По умолчанию все члены структуры являются «общедоступными». Когда вы объявляете структуру, вы создаете шаблон, который можно использовать для создания объектов структуры, совместно использующих одну и ту же организацию элементов данных и функций-членов. Декларации структуры всегда предшествует ключевое слово «struct», которое сообщает компилятору, что структура была объявлена. Давайте возьмем пример.
Давайте возьмем пример.
struct employee {строковое имя; строка company_name; струнный город; } Emp1, етр2;
Здесь мы объявляем структуру для хранения информации сотрудников. Объявление заканчивается точкой с запятой, поскольку объявление структуры является оператором, а в C ++ оператор завершается точкой с запятой.
Имя, данное структуре, определяет «тип» (в вышеприведенном примере имя структуры - «работник»). Переменные этих типов могут быть созданы, как указано выше, мы создали две переменные «emp1» и «emp2» типа «employee». В приведенном выше примере мы создали переменную «структура» сразу после объявления; поочередно, он может быть создан отдельно.
структура сотрудника emp1, emp2; // ключевое слово struct не является обязательным.
Члены структурной переменной могут быть инициализированы или доступны с помощью оператора точки (.).
emp1.name = "Ашока";
Информация, содержащаяся в одной структурной переменной, может быть назначена другой структурной переменной того же типа, как указано ниже.
emp1.name = "Ашока"; emp1.company_name = "Teckpix"; emp1.city = "Дели"; етр2 = emp1; // присваиваем значения члена emp1 для emp2. соиЬ <
Здесь мы присвоили структурную переменную «emp1» для «emp2», поэтому «emp1» копирует все значения своих членов в соответствующий член «epm2».
Член структурной переменной может быть передан в функцию.
функц (emp1.city);
Вся структурная переменная может быть передана в функцию как вызовом метода по значению, так и вызовом по ссылке.
Funt (emp1); // вызов функции методом вызова по значению. , , void funct (struct employee emp) {// получение значений членов emp1. соиЬ <
Здесь изменение значения члена структурной переменной не будет отражаться вне функции, поскольку переменная передается методом вызова по значению. Теперь давайте сделаем то же самое, вызвав метод ссылки.
Funt (& emp1); // вызов функции путем вызова ссылочного метода. , , void funct (struct employee * emp) {// получение адреса emp1. EMP-> город = «Нур»; // изменить значение члена (города) структурной переменной emp1. , }
Здесь структурная переменная передается по ссылке, поэтому изменение значения членов структурной переменной также отражается вне функции.
сотрудник отдела * emp; // удаление указателя на структуру типа employee. EMP = & emp1; // присваиваем адрес emp1 указателю. emp-> city // указатель доступа к городу-члену emp1.
Указатель на структуру также может быть создан; он содержит адрес структурной переменной.
В структуре агрегатная инициализация разрешена, когда определение структуры не содержит какого-либо определенного пользователем конструктора или виртуальных функций или базового класса или частного или защищенного поля.
int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Возможно, так как структура сотрудника не содержит ни одной из вышеперечисленных вещей.
Определение союза
Объединение - это область памяти, совместно используемая двумя или более различными типами переменных, объявленными для одного типа объединения. Ключевое слово, используемое для объявления союза - «союз». В C ++ объединение может содержать как функцию-член, так и переменные. По умолчанию все члены союза являются «публичными». Декларация о «союзе» аналогична декларации структуры.
union u_type {int x, char c; плавать f; } u1, u2;
Здесь мы объявили объединение с именем u_type. Члены типа u_type имеют тип «x» целочисленного типа, тип «c» символьного типа и тип «f» типа float. Мы также создали переменные объединения «u1» и «u2» типа «u_type» сразу после объявления объединения. Мы также можем объявить переменную объединения отдельно от объявления объединения.
int main () {union u_type u1, u2; // Ключевое слово union не является обязательным в C ++. }
Доступ к членам объединения может быть выполнен с помощью оператора точки (.), Перед которым стоит переменная объединения, а затем следует член этой переменной.
u1.x = 10;
Подобно структурам, агрегатная инициализация невозможна в объединении. Как мы знаем, объединение совместно использует одну и ту же ячейку памяти для всех своих членов одновременно, только одна переменная инициализируется, и все переменные автоматически обновляются с использованием инициализированного значения.
u1.x = 10; соиЬ <
Если вы попытаетесь изменить значение любого из членов u1. Другой член будет автоматически обновлен до этого значения.
u1.c = 65; соиЬ <
Пространство, отведенное союзу, равно размеру самого большого члена союза. Поскольку байт, выделенный для «char», равен 1 байту, «int» составляет 4 байта, а «float» составляет 4 байта, поэтому наибольший размер составляет 4 байта. Таким образом, память, выделенная для «u1» и «u2», составляет 4 байта.
int main () {int size_1 = sizeof (u1); // 4 int size_2 = sizeof (u2); // 4
Указатель на объединение может быть создан так же, как и в структуре. Указатель содержит адрес объединения.
union u_type * un; ип = & и1; соиЬ < Подобно структуре, объединение также может быть передано в функции как методами, то есть вызовом по значению и вызовом по ссылке. функц (u1); // вызов функции методом вызова по значению. , , void funct (union u_type un) {// получение значения члена u1. соиЬ < Теперь давайте вызовем функцию, используя метод вызова по ссылке. функц (& и1); // вызов функции путем вызова метода refrence. , , void funct (union u_type un) {// получение адреса u1. un-> x = 20. } В C ++ существует особый тип объединения, называемый «Анонимный союз». Анонимное объединение не может иметь имя типа, и никакая переменная такого объединения не может быть создана. Это только говорит компилятору, что его переменные-члены должны находиться в одном месте. На переменную анонимного объединения можно ссылаться без оператора обычной точки (.). int main () {union {// определяет анонимный союз без имени типа. int x, char c; плавать f; }; х = 10; // ссылаемся на переменную объединения с оператором out dot cout < В анонимном объединении запрещена любая функция-член, она не может содержать личные или защищенные данные, а глобальный анонимный союз должен быть указан как «статический». Точки, которые нужно помнить для нормальной декларации союза. И структура, и объединение являются типом данных контейнера, который содержит элементы разных типов. Но структуры используются, когда нам нужно хранить разные значения для всех членов в отдельной ячейке памяти. Объединения используются, когда необходимо преобразование типов.
сходства:
Вывод: