Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C.doc
Скачиваний:
29
Добавлен:
08.05.2015
Размер:
1.17 Mб
Скачать

Битовые поля

При описании структур могут быть использованы битовые поля. Например,

struct fr

{

int i:2;

int j:2;

unsigned k:2;

int :4;

int l:6;

} a,b,c;

обеспечивает следующее размещение (побитно):

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

l

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

k

j

i

Если приглядеться к описанию элементов этой структуры с именем fr, то видно, что характерной их особенностью является то, что все они имеют целый тип (длина 2 байта или 16 бит). Сумма чисел после двоеточия соответственно 16 (это биты, младший из которых имеет номер 0).

Объединения

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

Общая форма описания:

union <тег или список>

{

элементы

. . .

}

<список символических имен>;

Пример: получение доступа к младшему и старшему байту целой переменной типа unsigned

a.

union

{

unsigned int a;

unsigned char b[2];

} c;

. . .

c.a=30000;

. . .

/* c.b[0] - младший байт

c.b[1] - старший байт */

При описании объединений можно создать тип объединения с использованием описания типа typedef.

б.

typedef union

{

unsigned int a;

unsigned char b[2];

} f;

f c;

. . .

c.a=30000;

. . .

/* c.b[0] - младший байт

c.b[1] - старший байт */

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

в.

typedef union

{

unsigned int a;

struct {

unsigned char l;

unsigned char r;

} b;

} f;

f c;

. . .

c.a=30000;

. . .

/* c.b.l - младший байт

c.b.r - старший байт */

Псевдофункция sizeof

Эта псевдофункция вызывается следующим образом:

sizeof(имя объекта или типа)

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

Примеры:

1.

sizeof(double) вернет значение 8.

2.

int a[3];

. . .

sizeof(a) вернет значение 6 (3*2).

Основные директивы препроцессора

При обработке файла с текстом программы транслятор с С может использовать препроцессор. Так называется программа, которая занимается предварительной обработкой текста в соответствии с директивами препроцессора. Она включается между компилятором и источником текста программы.

Основные директивы препроцессора:

1.

#define <что менять> <на что менять>

При этом в тексте программы будет произведена замена символов <что менять> на символы <на что менять>.

Примеры:

а.

#define PI 3.14159265

Теперь, если мы пишем в программе PI, то это эквивалентно, что если бы мы писали 3.14159265

б.

#define begin {

#define end }

В этом случае вместо { можно писать begin, а вместо } end.

2.

#undef <что менять>

Эта директива снимает назначение, установленное директивой #define.

3.

#include "<имя файла>"

В этом случае будет в текст программы вставлены операторы из указанного файла.

Пример:

#include "prog1.c"

/* при обработке препроцессором вместо этой строки будет

идти текст программы из файла prog1.c */

main()

{

. . .

Если же написано

#include <stdio.h>

то это означает, что файл с именем stdio.h надо искать не в текущем разделе, а в пути, указанном оболочке Turbo-C.

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