Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4119

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Глава 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 приведена функция, 
которая распечатывает поля структуры. 


background image

Часть 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 


background image

Глава 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; 


background image

Часть 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; 


background image

Глава 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  покажем,  как  объяв-
лять синонимы для типов функций и указателей на функции. 


Смотрите также файлы