КАТЕГОРИИ: Архитектура-(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; } } В отличие от структуры объединение может инициализироваться только значением его первого поля, а также не может содержать битовых полей.
Дата добавления: 2014-01-20; Просмотров: 323; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |