- •1. Понятие структур.
- •2. Определение структур.
- •4. Примеры структур
- •6. Задание структуры с помощью оператора typedef.
- •7. Обращение к полям структуры.
- •9. Вложение структур в структуры.
- •10. Присваивание структур
- •11. Массивы в структурах.
- •12. Структуры и функции.
- •13. Указатели и ссылки в структурах.
- •14. Массивы структур.
- •15. Указатели на структуры.
6. Задание структуры с помощью оператора typedef.
От обязательногоиспользования ключевого слова struct можно отказаться, если описывать структуру, используя оператор объявления типа typedef в следующем виде:
typedef struct [первичное имя типа] {...} имя типа;
Первичное имя типа, указываемое перед перечнем полей структуры является необязательным и указывается редко. Как правило, первичное имя типа имеет тот же идентификатор, что и основное имя типа, но начинается со знака подчеркивания.
Структура, содержащая информацию о книге (ФИО автора, название книги, год издания):
typedef struct {
char author[20], title[50];
unsigned year;
} BOOK;
Объявление переменной данного типа:
BOOK book = {"А. Дюма”,”Три мушкетера”, 1986}; От обязательногоиспользования ключевого слова struct можно отказаться, если описывать структуру, используя оператор объявления типа typedef в следующем виде:
typedef struct [первичное имя типа] {...} имя типа;
Первичное имя типа, указываемое перед перечнем полей структуры является необязательным и указывается редко. Как правило, первичное имя типа имеет тот же идентификатор, что и основное имя типа, но начинается со знака подчеркивания.
Структура, содержащая информацию о книге (ФИО автора, название книги, год издания):
typedef struct {
char author[20], title[50];
unsigned year;
} BOOK;
Объявление переменной данного типа:
BOOK book = {"А. Дюма”,”Три мушкетера”, 1986};
7. Обращение к полям структуры.
Доступ к отдельным членам структуры осуществляется с помощью оператора . (который обычно называют оператором точка или оператором доступа к члену структуры).
имя_переменной.имя_поля
Сначала указывается имя переменной структуры, а затем, через точку, имя поля. С точки зрения языка С при таком обращении к полю его значение может выступать как LValue, так и RValue значения.
Например, в следующем выражении полю zip в уже объявленной переменной-структуре addr_info присваивается значение ZIP-кода, равное 12345:
addr_info.zip = 12345;
Этот отдельный член определяется именем объекта (в данном случае addr_info), за которым следует точка, а затем именем самого этого члена (в данном случае zip). В общем виде использование оператора точка для доступа к члену структуры выглядит таким образом:
имя-объекта.имя-члена
Поэтому, чтобы вывести ZIP-код на экран, напишите следующее:
printf("%d", addr_info.zip);
Будет выведен ZIP-код, который находится в члене zip переменной-структуры addr_infо.
Точно так же в вызове gets() можно использовать массив символов addr_infо.name:
gets(addr_info.name);
Таким образом, в начало name передается указатель на символьную строку.
Так как name является массивом символов, то чтобы получить доступ к отдельным символам в массиве addr_info.name, можно использовать индексы вместе с name. Например, с помощью следующего кода можно посимвольно вывести на экран содержимое addr_info.name:
for(t=0; addr_info.name[t]; ++t)
putchar(addr_info.name[t]);
Обратите внимание, что индексируется именно name (а не addr_info). Помните, что addr_info — это имя всего объекта-структуры, a name — имя элемента этой структуры. Таким образом, если требуется индексировать элемент структуры, то индекс необходимо указывать после имени этого элемента.
Использование элементов структуры в выражениях.
Вычисление длины окружности, заданной переменной cir типа Circle:
double length = 2.0*3.1415*cir.radius;
8. Ввод вывод информации в структуре.
Ввод информации о студенте в переменную st типа Student:
scanf("%s %s %s %u %lf”, &st.surname, &st.name,
&st.patronymic, &st.number, &st.rate);
Вывод на экран списка группы, заданной в переменой gr типа Group:
printf("Группа: %s\n”,gr.name);
for(unsigned i=0;i printf("%2u: %15s %15s %15s %6u %.1lf\n”, i+1, gr.list[i].surname, gr.list[i].name, gr.list[i].patronymic, gr.list[i].number, gr.list[i].rate);
printf("%d,%d", pt.x, pt.y);