Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

13_Structures

.pdf
Скачиваний:
10
Добавлен:
14.05.2015
Размер:
2.35 Mб
Скачать

Использование

структур

Копирование структур

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

Динамические структуры

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

Структуры и функции

Битовые поля

 

 

 

 

Использование структур

22

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Копирование структур

Задача: скопировать структуру b1 в b2.

По элементам:

struct Book b1, b2;

Функция копирования строк

описана в string.h

...

// здесь вводим b1

 

strcpy ( b2.author, b1.author ); strcpy ( b2.title, b1.title ); b2.year = b1.year;

b2.pages = b1.pages;

Копирование «бит в бит»:

!

 

Первые два

#include <mem.h>

 

параметра – адреса

...

куда откуда

сколько байт

структур!

 

 

 

 

memcpy ( &b2, &b1, sizeof(Book) );

или просто так:

b2 = b1;

 

 

 

 

Использование структур

 

 

23

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

Объявление:

B[0]

...

B[9]

 

 

 

 

 

struct Book B[10];

Обращение к полям:

for ( i = 0; i < 10; i ++ ) B[i].year = 2008;

author

title

year

pages

 

 

 

 

Book

Запись в двоичный файл: write binary

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 );

указатель на файл

fread возвращает число удачно прочитанных блоков!

 

 

 

 

Использование структур

24

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Выделение памяти под структуру

 

выделить память под

 

структуру, записать ее

struct Book *p;

адрес в переменную p

 

p ==new(structBook;Book*)malloc(sizeof(struct Book));

printf ( "Автор " );

gets ( pp-->author );

printf ( "Название книги " );

!

 

Для обращения

 

 

 

gets ( p->title );

 

 

к полю структуры

printf ( "Количество страниц " );

 

по адресу

 

используется

scanf ( "%d", &p->pages );

 

 

стрелка ->!

 

 

 

 

p->year = 2008;

 

 

 

 

 

 

...

 

освободить

 

 

 

 

 

 

del te

 

 

 

 

память

 

 

free(p)p;

 

 

 

 

 

 

 

Использование структур

25

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Динамические массивы структур

Задача: выделить память под массив структур во время выполнения программы.

 

В этот указатель будет

Bookstruct*B;Book *B;

записан адрес массива

 

int n;

 

printf ( "Сколько у вас книг? " );

выделяем память

 

scanf ( "%d", &n );

B ==new(structBook[n];Book *) malloc(n*sizeof(struct Book));

... /* здесь заполняем массив B */ for ( i = 0; i < n; i++ )

printf ( "%s. %s. %d.\n", B[i].author, B[i].title, B[i].year);

free(B);

освобождаем память

free(B);

 

 

 

 

 

Использование структур

26

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Структуры и функции

Структуры могут быть параметрами и возвращаемыми значениями функций

struct Point Shift(struct Point p, int dx, int dy) { struct Point q;

q.x=p.x+dx;

Параметры передаются

q.y=p.y+dy;

по значению!

 

return q;

Сдвиг точки

 

}

 

void main() {

 

struct Point pnt={10,10};

printf (“До сдвига: (%d,%d)\n“, pnt.x, pnt.y );

pnt=Shift(pnt,100,0);

/* сдвиг по оси X */

printf (“После сдвига: (%d,%d)\n“, pnt.x, pnt.y );

}

 

 

 

 

Использование структур

27

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Структуры и функции

Структуры могут быть параметрами и возвращаемыми значениями функций

struct Point Shift(struct Point * const p,

 

int dx, int dy)

{

Большие структуры

лучше передавать по struct Point q = {p->x+dx,p->y+dy};указателю, чтобы

return q;

избежать копирования

 

}

 

void main() {

 

struct Point pnt={10,10};

printf (“До сдвига: (%d,%d)\n“, pnt.x, pnt.y ); pnt=Shift(&pnt,100,0); /* сдвиг по оси X */ printf (“После сдвига: (%d,%d)\n“, pnt.x, pnt.y );

}

 

 

 

 

Использование структур

28

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Битовые поля

При описании структуры можно регулировать количество памяти для полей с точностью до бита

struct TFriend { int IsBoy; char IsStudent; char IsTheBest; char Age;

} friend;

friend.IsBoy = 1; friend.IsStudent = 0;

friend.IsTheBest

= 1;

friend.Age

= 19;

friend.IsBoy

= 6;

Нет необходимости тратить несколько байт на бинарные значения

Иногда это не только не эффективно, но и опасно

 

 

 

 

Использование структур

29

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Битовые поля

При описании структуры можно регулировать количество памяти для полей с точностью до бита

struct TFriend { int IsBoy:1; char IsStudent:1; char IsTheBest:1; char Age:7;

} friend;

friend.IsBoy

= 1;

friend.IsStudent = 0;

friend.IsTheBest

= 1;

friend.Age

= 19;

friend.IsBoy

= 6; /*=0*/

Количество бит, затрачиваемых на поле

При присвоении происходит урезание значений

Объединения

Что такое объединение?

Использование объединений

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]