ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4261
Скачиваний: 28
Глава 8. Типы данных, определяемые программистом
111
Доступ к элементам битового поля осуществляется так же, как и
доступ к обычным членам структуры при помощи оператора
.
(точка).
Битовые поля могут использоваться в выражениях точно так же,
как и переменные базового типа битового поля. Однако к бито-
вому полю не может применяться оператор определения адреса.
В листинге 8.2 приведен пример работы с битовыми полями.
Листинг 8.2. Работа с битовыми полями
#include <stdio.h>
struct demo
{
int count;
unsigned b1 : 1;
unsigned b2 : 1;
double d;
};
int main(void)
{
struct demo d;
unsigned n = 10;
d.b1 = 1;
d.b2 = 0;
printf("d.b1 = %u\n", d.b1); /* d.b1 = 1 */
printf("d.b2 = %u\n", d.b2); /* d.b2 = 0 */
n += d.b1;
printf("n = %u\n", n); /* n = 11 */
return 0;
}
8.6. Передача структур в функции
Когда структура используется как параметр функции, то она пе-
редается в функцию по значению, как и принято в языке про-
граммирования С. Например, в листинге 8.3 приведена функция,
которая распечатывает поля структуры.
Часть I. Язык программирования С
112
Листинг 8.3. Передача структуры в функцию по значению
#include <stdio.h>
struct emp
{
int empno;
char name[20];
double salary;
};
void print(struct emp s)
{
printf("%d %s %f\n", s.empno, s.name, s.salary);
}
int main(void)
{
struct emp e = {10, "Tim", 1000};
print(e); /* печать значений членов структуры */
return 0;
}
Если необходимо, чтобы функция изменяла значение членов
структуры, то в функцию передается указатель на структуру.
В этом случае для доступа к членам структуры используется опе-
ратор
->
, который имеет следующий вид:
указатель->имя_поля
Здесь
указатель
должен указывать на структуру. Этот оператор
возвращает L-value, имеет ассоциативность слева направо и его
приоритет совпадает с приоритетом постфиксных операций ин-
кремента и декремента.
В листинге 8.4 приведен пример функции, которая инициализи-
рует члены структуры через указатель.
Листинг 8.4. Доступ к членам структуры через указатель
#include <stdio.h>
#include <string.h>
struct emp
Глава 8. Типы данных, определяемые программистом
113
{
int empno;
char name[20];
double salary;
};
void init_emp(struct emp *ps, int en, char *nm, double sal)
{
ps->empno = en;
strcpy(ps->name, nm);
ps->salary = sal;
}
int main(void)
{
struct emp e;
init_emp(&e, 10, "Tim", 1000);
printf("%d %s %f\n", e.empno, e.name, e.salary);
return 0;
}
Аналогично передаются в функции и объединения. Например, в
листинге 8.5 приведена функция, которая выводит на консоль
содержимое объединения, получая указатель на это объединение.
Листинг 8.5. Доступ к членам объединения через указатель
#include <stdio.h>
union num
{
int n;
double f;
};
void print(char c, union num *n)
{
switch(c)
{
case 'i':
printf("n = %d\n", n->n);
break;
Часть I. Язык программирования С
114
case'f':
printf("f = %f\n", n->f);
break;
default:
printf("Unknown type.\n");
}
}
int main(void)
{
union num n;
n.n = 10;
print('i', &n);
n.f = 10.5;
print('f', &n);
return 0;
}
8.7. Объявление
typedef
Для определения другого имени для существующего типа данных
используется объявление
typedef
, которое имеет следующий вид:
typedef имя_типа список_идентификаторов;
Здесь
typedef
— ключевое слово,
имя_типа
является именем су-
ществующего типа данных, а
список_идентификаторов
содержит
новые имена существующего типа данных, которые перечисля-
ются через запятую и называются
синонимами
имени сущест-
вующего типа данных. Как уже говорилось в
разд. 8.1
, синонимы
используются для придания именам типов более осмысленных
названий или для их сокращения.
Можно определять синонимы как для встроенных типов данных,
так и для типов данных, объявляемых программистом. Например:
typedef double salary;
typedef unsigned int order;
Глава 8. Типы данных, определяемые программистом
115
Теперь эти типы можно использовать для объявления пере-
менных:
salary s = 1000;
order ord = 5;
Можно определять синонимы для массивов. Например:
typedef int arr[10];
arr a;
Здесь
a
массив из десяти элементов типа
int
.
Можно определять синонимы для анонимных структур. Например:
typedef struct
{
int empno;
char name[20];
double salary;
} emp;
Теперь можно объявлять переменные типа
emp
и работать с этими
переменными как с обычными структурами. Например:
emp e = {10, "Tim", 1000};
e.salary = 2000;
При определении синонима для типа можно также объявить и
указатель на этот тип. Например:
typedef struct s
{
int n;
} ti, *tip;
Теперь можно объявлять указатели на тип
s
, используя синоним
tip
. Например:
ti n = {10};
tip pn = &n;
В заключение этого раздела в листинге 8.6 покажем, как объяв-
лять синонимы для типов функций и указателей на функции.