Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Объединения. В практике программирования большое распространение получили массивы структур, т.е

Битовые поля

Массивы структур

 

В практике программирования большое распространение получили массивы структур, т.е. массивы, элементами которых являются переменные структурного типа. Например, оператор

struct point mas[3];

описывает массив, состоящий из трех элементов типа struct point. Описание можно дополнить инициализацией:

struct point mas[ ] = {{10, 10, “Red”}, {20, 20, “Green”}, {30, 30, “Blue”}};

Если инициализаторы – простые константы или строки символов, и все они имеются в наличии, во внутренних скобках нет необходимости:

struct point mas[ ] = {10, 10, “Red”, 20, 20, “Green”, 30, 30, “Blue”};

Ввод данных в массив структур с клавиатуры и вывод их на экран можно выполнить следующим образом:

int i;

for(i=0; i<3; i++)

{

scanf(“%d%d%s”, &mas[i].x, &mas[i].y, &mas[i].color);

printf("(%d,%d) %s", mas[i].x, mas[i].y, mas[i].color);

}

То же самое с использованием механизма указателей:

struct point *p;

p = mas; //можно объединить 2 строки: struct point *p = mas;

for(i=0; i<3; i++)

{

scanf("%d%d%s", &(p+i)->x, &(p+i)->y, &(p+i)->color);

printf("(%d,%d) %s", (p+i)->x, (p+i)->y, (p+i)->color);

}

 

Битовые поля – это особый вид полей структуры. Они используются для плотной упаковки данных, например, флажков типа «да/нет». Дело в том, что минимальная адресуемая ячейка оперативной памяти имеет длину один байт (8 бит), в то время как для хранения флажка достаточно одного бита. При описании битового поля после имени через двоеточие указывается длина поля в битах. Битовые поля могут быть любого целого типа и обычно используется тип unsigned int (сокращенно unsigned). Например:

struct options

{

unsigned bold: 1;

unsigned italic: 1;

unsigned underline: 1;

unsigned background: 4;

} opt;

Под переменную opt структурного типа options будет отведена память размером 1 байт (если не использовать битовые поля, то структурная переменная будет занимать минимум 4 байта).

Следует учитывать, что операции с отдельными битами реализуются гораздо менее эффективно, чем с байтами и словами, т.к. компилятор должен генерировать специальные коды, увеличивающие общий объем кода программы. Размещение битовых полей в памяти зависит от компилятора и аппаратуры.

 

 

Объединение представляет собой частный случай структуры, все поля которой располагаются по одному и тому же адресу. Формат описания такой же, как и у структуры, только вместо ключевого слова struct используется слово union. Длина объединения равна наибольшей из длин его полей. В каждый момент времени объединение хранит только одно значение, и ответственность за его правильное использование лежит на программисте.

Объединения применяют для экономии памяти в тех случаях, когда известно, что больше одного поля одновременно не используется. Пример:

#include <stdio.h>

void main()

{

int payType; //тип платежа

union payment

{

char card[25]; //оплата по карте

int check; //оплата чеком

} info;

... //присваивание значений переменным payType и info

switch (payType)

{

case 0: printf("Оплата по карте: %s", info.card); break;

case 1: printf("Оплата чеком: %d", info.check); break;

}

}

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

<== предыдущая лекция | следующая лекция ==>
Структуры. В этой и предыдущей лекциях мы обсудили наиболее важные аспекты языка SQL, связанные с определением схемы базы данных | Функции в языке С
Поделиться с друзьями:


Дата добавления: 2014-01-20; Просмотров: 279; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.014 сек.