comp – функция, возвращающая указатель на void
cmp – указатель на функцию, возвращающую void
x – функция, возвращающая указатель на массив из указателей на функции, возвращающие char
При компиляции
возникнет ошибка:
попытка изменить константное значение по указателю
57
3
Как описывается структура?
struct Book {
char author[40]; // автор
char title[80]; // название
int year; // год издания
int pages; // количество страниц
};
структура
название
поля
struct Point {
int x; // абсцисса
int y; // ордината
};
структура
название
поля
Как придать значения полям структуры?
struct Point O = {0,0};
struct Book book3 = {“А.С. Пушкин”, “Полтава”,
1998, 220};
my_point.x = 4;
my_point.y = 5;
strcpy ( book1.author, "А.С. Пушкин" );
strcpy ( book1.title, "Полтава" );
book1.year = 1998;
book1.pages = 223;
Обращение к полям структуры – через точку
Возможна инициализация полей при описании переменной-структуры
Возможно совмещение описания типа и объявления переменных
struct {
int x;
int y;
} A, B={10,13};
Возможно описание переменных-структур безымянного типа.
Повторное описание переменных того же типа невозможно!
Использование typedef позволяет укоротить описание переменных (не указывать struct )
struct Point {
int x;
int y;
};
struct Point A, B={10,13};
Без typedef наименование типа всегда состоит из struct и метки структуры
Структуры могут вкладываться друг в друга
Обращение к полям вложенных структур –
через точку
Указатель на переменную-структуру
Для доступа к полям структуры по указателю используется оператор ->
ch:0xbfced6e0
l: 0xbfced6e4
i: 0xbfced6ec
d: 0xbfced6f0
24
Архитектура IA32 Linux: выравнивание на границу машинного слова:
3 выравнивающих байта
ch:0x22ccc0
l: 0x22ccc8
i: 0x22ccd0
d: 0x22ccd8
32
Архитектура IA32 Windows: выравнивание на границу 2 машинных слов
4 выравнивающих байта
7 выравнивающих байт
Типы структур:
списки
деревья
графы
односвязный
двунаправленный (двусвязный)
циклические списки (кольца)
struct ListItem {
int data;
struct ListItem *prev; /* предыдущий элемент */
struct ListItem *next; /* следующий элемент */
};
Указатель на
описываемую структуру
Двунаправленный (двусвязный) списко
Задача: скопировать структуру b1 в b2.
Копирование «бит в бит»:
#include или просто так: b2 = b1; куда откуда сколько байт Функция копирования строк описана в string.h
...
memcpy ( &b2, &b1, sizeof(Book) );
B[0] ... B[9]
Запись в двоичный файл:
Чтение из двоичного файла:
FILE *f;
f = fopen("input.dat", "wb" );
fwrite ( B, sizeof(Book), 10, f );
f = fopen("input.dat", "rb" );
n = fread ( B, sizeof(Book), 10, f );
printf ( "Прочитано %d структур", n );
адрес массива
размер блока
сколько блоков
указатель на файл
Book
write binary
p = (struct Book*)malloc(sizeof(struct Book));
выделить память под структуру, записать ее адрес в переменную p
p->author
free(p);
освободить память
Задача: выделить память под массив структур во время выполнения программы.
B = (struct Book *) malloc(n*sizeof(struct Book));
struct Book *B;
free(B);
В этот указатель будет записан адрес массива
выделяем память
освобождаем память
Структуры могут быть параметрами и возвращаемыми значениями функций
Параметры передаются по значению!
Сдвиг точки
Структуры могут быть параметрами и возвращаемыми значениями функций
Большие структуры лучше передавать по указателю, чтобы избежать копирования
При описании структуры можно регулировать количество памяти для полей с точностью до бита
Нет необходимости тратить несколько байт на бинарные значения
Иногда это не только не эффективно,
но и опасно
При описании структуры можно регулировать количество памяти для полей с точностью до бита
Количество бит, затрачиваемых на поле
При присвоении происходит урезание значений
Как описывается объединение?
union int_float {
unsigned int int_value; /* 32-битное целое */
float float_value; /* 32-битное ЧПТ */
} x;
объединение
название
переменная
union int_float {
unsigned int int_value; /* 32-битное целое */
float float_value; /* 32-битное ЧПТ */
} x;
3
…
x.int_value
x.float_value
union int_char {
unsigned char char_value; /* 8 бит */
unsigned int int_value; /* 32 бит */
} x;
...
x.int_value = 0x11223344;
x.char_value = 0xAB;
printf(“int: 0x%X\n“,x.int_value); /*=>0x112233AB */
printf(“char: 0x%X\n“,x.char_value);/*=>AB */
printf(“sizeof: %d\n“,sizeof(x)); /*=>4 (байта) */
Представление IP-адреса
в BSD-сокетах
Н.Копейкин Жуков
Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть