Доступ к членам структуры
Доступ к отдельным членам структуры осуществляется с помощью оператора. (обычно называется «точкой») Например, следующий фрагмент кода присваивает члену zip структурной переменой addr_info значение 12345:
addr_info.zip = 12345;
За именем структурной переменной следует точка, а за ней имя члена, к которому происходит обращение. Ко всем членам структуры доступ осуществляется точно таким же способом. Стандартный вид доступа следующий:
имя_структуры.имя_члена
Следовательно, для вывода поля zip на экран надо написать:
printf("%ld", addr_info.zip);
Данная строка выводит на экран содержимое поля zip структурной переменной addr_nfo. Таким же образом массив символов addr_info.name может использоваться в gets():
gets (addr_infо.name);
Данная команда передает указатель на символ, указывающий на начало name.
Для доступа к отдельным элементам addr_info.name можно использовать индекс name. Например, можно вывести содержимое addr_info.name посимвольно с помощью следующего кода:
registerint t;
for(t=0; addr_info.name [t]; ++t) putchar (addr_info.name [t]);
2 вопрос:Присваивание структур
Присваивание структур
Информация, содержащаяся в одной структуре, может быть присвоена другой структуре того же типа с помощью одиночного оператора присваивания, то есть не нужно присваивать значение каждого члена по отдельности. Следующая программа демонстрирует присваивание структур:
#include<stdio.h>
intmain(void)
{
struct {
int a;
int b;
} x, y;
x.a = 10;
x.b = 20;
у = x; /* присвоение одной структуры другой */
printf ("Contentsof у: %d %d.", y.a, y.b);
return 0;
}
После присваивания у.а и y.b будут содержать значения 10 и 20 соответственно.
3 вопрос:Массивы структур
Массивы структур
Возможно, наиболее часто структуры используются в виде массивов структур. Для объявления массива структур следует сначала определить структуру, а затем объявить массив переменных данного типа. Например, для объявления 100-элементного массива структур типа addr следует написать:
structaddraddr_info[100];
В результате получаем набор из 100 переменных, устроенных, как объявлено в типе структуры addr.
Для доступа к отдельным структурам массива adar_info следует проиндексировать имя массива. Например, для вывода содержимого поля zip третьей структуры, следует написать:
printf("%ld", addr_info[2].zip);
Как и массивы переменных, массивы структур индексируются с нуля.
4 вопрос:Передача структур функциям
Вопрос:Передача членов структур
Передача членов структур в функции
При передаче членов структур в функции фактически передается значение члена. Следовательно, передается обычная переменная. Рассмотрим для примера следующую структуру:
structfred {
char x;
int y;
float z;
char s[10];
} mike;
Ниже приведены примеры передачи каждого члена в функцию:
func(mike.х); /* передача символьного значения х */
func2(mike.у); /* передача целочисленного значения у */
func3(mike.z); /* передача вещественного значения z */
func4(mike.s); /* передача адреса строки s */
func(mike.s[2]); /* передача символьного значения s [2] */
Тем не менее, если необходимо передать адрес отдельного члена структуры, следует поместить оператор & перед именем структуры. Например, для передачи адреса элементов структуры mike следует написать:
func(&mxke.x); /* передача адреса символа x */
func2(&mike.у); /* передача адреса целого у */
func3(&mike.z); /* передача адреса вещественного z */
func4(mike.s); /* передача адреса строки s */
func(&mike.s [2]); /* передача адреса символа s[2] */
Обратим внимание, что оператор & стоит перед именем структуры, а не перед именем члена. Помимо этого, массив s сам по себе является адресом, поэтому не требуется оператора &. Тем не менее, когда осуществляется доступ к отдельному символу строки s, как показано в последнем примере, оператор & необходим.
6 вопрос:Передача целых структур
Когда структура используется как аргумент функции, передается вся структура с помощью стандартной передачи по значению. Это означает, что любые изменения, внесенные в содержимое структуры внутри функции, не повлияют на структуру, используемую в качестве аргумента.
Когда структура используется как параметр, самое важное - это запомнить, что тип аргумента должен соответствовать типу параметра. Лучший способ сделать это - определить структуру глобально, а затем использовать ее ярлык для объявления необходимых структурных переменных и параметров. Например:
#include<stdio.h>
/* объявление типа структуры */
structstruct_type {
int a, b;
charch;
};
void f1(structstruct_typeparm);
intmain(void)
{
structstruct_typearg; /* объявление arg */
arg.a = 1000;
f1(arg);
return 0;
}
void f1(structstruct_typeparm) {
printf("%d", parm.a);
}
Данная программа выводит число 1000 на экран. Можно видеть, что как arg, так и parm объявлены как структуры типа struct_type.
7 вопрос:Указатели на структуры
Использование указателей на структуру
Для получения адреса структурной переменной следует поместить оператор & перед именем структуры. Пусть имеется следующий фрагмент
structbal {
floatbalance;
charname[80];
} person;
structbal *p; /* объявление указателя на структуру */
тогда
p = &регson;
помещает адрес структуры person в указатель р.
Для доступа к членам структуры с помощью указателя на структуру следует использовать оператор "стрелка". Оператор "стрелка", ->, образован из знака "минус" и символа "больше". Например, для доступа к члену balance с помощью p следует написать:
p->balance
Чтобы понять способы использования указателей на структуры, рассмотрим следующую простую программу, выводящую часы, минуты, и секунды, используя программный таймер. (Скорость работы таймера можно регулировать, изменяя макроопределение DELAY.)
/* Отображение программного таймера. */
#Include <stdio.h>
#include <conio.h>
#define DELAY 128000
structmy_time {
int hours;
int minutes;
int seconds;
};
void update(structmy_time *t), display(structmy_time *t);
void mydelay(void);
int main(void)
{
structmy_timesystime;
systime.hours = 0;
systime.minutes = 0;
systime.seconds = 0;
for (;;) {
update(&systime);
display(&systime);
if (kbhit()) return 0;
}
}
void update(structmy_time *t)
{
t->seconds++;
if (t->seconds==60)
{
t->seconds = 0;
t->minutes++;
}
if (t->minutes==60)
{
t->minutes = 0;
t->hours++;
}
if (t->hours==24) t->hours = 0;
mydelay();
}
void display(structmy_time *t)
{
printf("%02d:", t->hours);
printf("%02d:", t->minutes);
printf("%02d\n", t->seconds);
}
void mydelay(void)
{
long int t;
for(t=1; t<DELAY; ++t);
}
Объявляется глобальная структура my.time. В функции main()объявляется и инициализируется значением 00:00:00 структурная переменная systime типа my_time. Это означает, что systime известна только функции main().
Функции update(), изменяющая время, и display(), выводящая на экран время, получают адрес systime. В обеих функциях аргумент объявлен как указатель на структуру типа my_time. В функциях к каждому структурному элементу обращение, на самом деле, происходит с помощью указателя.
Например, для установки часов в 0, когда достигается 24:00:00, используется следующий оператор.
if(t->hours==24) t->hours = 0;
Данная строка сообщает компилятору о необходимости взятия адреса t (который указывает на systime в функции main()) и присвоения нуля члену hours.
![]() | ПАМЯТКА: Для доступа к членам структуры при работе с самой структурой используется оператор «точка». При обращении к структуре с помощью указателя используется оператор «стрелка». |
В качестве последнего примера использования указателей на структуры рассмотрим программу, иллюстрирующую применение функции целочисленного ввода. Функция input_xy() определяет координаты х и у, в которых будет выводиться подсказка, а потом вводит целочисленное значение. С этой целью она использует структуру xyinput.
/* Пример обобщенного ввода с помощью указателей на структуры. */
#include<stdio.h>
#include<conio.h>
#include<string.h>
structxyinput {
int x, у; /* положение подсказки на экране */
charmessage[80]; /* подсказка */
int i; /* введенное значение */
};
voidinput_xy(structxyinput *info);
intmain(void)
{
structxyinputmess;
mess.x = 10;
mess.у = 10;
strcpy(mess.message, "Enteraninteger: ");
clrscr();
input_xy(&mess);
printf("Yournumbersquaredis: %d.", mess.i*mess.i);
return 0;
}
/* вывод сообщения о подсказке в указанной позиции и ввод целочисленного значения */
voidinput_xy(structxyinput *info)
{
gotoxy(info->x, info->y);
printf(info->message);
scanf ("%d", &info->i);
}
Программа использует функции clrscr() и gotoxy() для очистки экрана и позиционирования курсора соответственно. Обе функции используют заголовочный файл conio.h Функция типа input_ху() полезна, когда программа выводит различные куски информации. (Фактически, можно создать несколько функции типа input_xy(), вводящих другие типы данных.)