#include #include using namespace std; void print_in_hex(uint8_t byte) { printf("%02X ", byte); } void print_in_hex(const void* data, size_t size) { const uint8_t* bytes = (const uint8_t*)data; for (size_t i = 0; i < size; i++) { print_in_hex(bytes[i]); if ((i + 1) % 8 == 0) printf("\n"); } printf("\n"); } void print_in_binary(uint8_t byte) { for (int i = 7; i >= 0; i--) { printf("%d", (byte >> i) & 1); if (i % 8 == 0) printf(" "); } } void print_in_binary(const void* data, size_t size) { const uint8_t* bytes = (const uint8_t*)data; for (size_t i = 0; i < size; ++i) { print_in_binary(bytes[i]); if ((i + 1) % 8 == 0) printf("\n"); } } #pragma pack(1) // Структура студента struct Student { // Имя char _name[17]; // год поступления uint16_t _year; // средний балл float _averageGrade; // пол (0 — женский, 1 — мужской) uint8_t _gender : 1; // количество пройденных курсов uint8_t _numCourses : 7; // указатель на старосту группы Student* _leader; }; #pragma pack() int main() { setlocale(LC_ALL, "Russian"); Student students[3] = {0}; // Заполнение данных для старосты strcpy(students[0]._name, "Ольга"); students[0]._year = 2020; students[0]._averageGrade = 4.9f; students[0]._gender = 0; students[0]._numCourses = 7; students[0]._leader = nullptr; // Заполнение данных для второго студента strcpy(students[1]._name, "Иван"); students[1]._year = 2020; students[1]._averageGrade = 4.5f; students[1]._gender = 1; students[1]._numCourses = 5; students[1]._leader = &students[0]; // Заполнение данных для третьего студента strcpy(students[2]._name, "Данил"); students[2]._year = 2021; students[2]._averageGrade = 4.8f; students[2]._gender = 1; students[2]._numCourses = 6; students[2]._leader = &students[0]; // Вывод адреса и размера массива cout << "Адрес массива: " << &students << endl; cout << "Размер массива: " << sizeof(students) << " байт" << endl; // Вывод адресов и размеров всех элементов массива for (int i = 0; i < 3; i++) { cout << "Адрес элемента " << i << ": " << &students[i] << endl; cout << "Размер элемента " << i << ": " << sizeof(students[i]) << " байт" << endl; } // Вывод информации о полях одного из элементов массива (не старосты) int index = 1; Student& student = students[index]; cout << "Информация о студенте " << index << ":" << endl; cout << "Значение поля _name: " << student._name << endl; cout << "Адрес поля _name: " << &(student._name) << endl; cout << "Смещение поля _name от начала структуры: " << offsetof(Student, _name) << " байт" << endl; cout << "Размер поля _name: " << sizeof(student._name) << " байт" << endl; cout << "Шестнадцатеричное представление поля _name:" << endl; print_in_hex(student._name, sizeof(student._name)); cout << "Двоичное представление поля _name:" << endl; print_in_binary(student._name, sizeof(student._name)); cout << endl; cout << "Элементы массива в шестнадцатеричном виде:" << endl; cout << "(Первые " << sizeof(student._name) << " байт - поле _name):" << endl; cout << "(Далее " << sizeof(student._year) << " байта - поле _year):" << endl; cout << "(Далее " << sizeof(student._averageGrade) << " байта - поле _averageGrade):" << endl; cout << "(Далее " << sizeof(uint8_t) << " байта - 1 бит для _gender и 7 бит для _numCourses):" << endl; cout << "(Далее " << sizeof(student._leader) << " байта - поле _leader):" << endl; for (int i = 0; i < 3; i++) { cout << "Студент с индексом " << i << endl; print_in_hex(&students[i], sizeof(students[i])); } system("pause"); return 0; }