Программирование на C и C++

Онлайн справочник программиста на C и C++

Использование указателей на структуру

Для получения адреса структурной переменной следует поместить оператор & перед именем структуры. Пусть имеется следующий фрагмент

struct bal {
float balance;
char name[80];
} person;

struct bal *p; /* объявление указателя на структуру */

тогда

p = &регson;

помещает адрес структуры person в указатель р.

Для доступа к членам структуры с помощью указателя на структуру следует использовать оператор "стрелка". Оператор "стрелка", ->, образован из знака "минус" и символа "больше". Например, для доступа к члену balance с помощью p следует написать:

p->balance

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

/* Отображение программного таймера. */
#Include <stdio.h>
#include <conio.h>
#define DELAY 128000
struct my_time {
int hours;
int minutes;
int seconds;
};

void update(struct my_time *t), display(struct my_time *t);
void mydelay(void);

int main(void)
{
struct my_time systime;
systime.hours = 0;
systime.minutes = 0;
systime.seconds = 0;
for (;;) {
update(&systime);
display(&systime);
if (kbhit()) return 0;
}
}

void update(struct my_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(struct my_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>

struct xyinput {
int x, у; /* положение подсказки на экране */
char message[80]; /* подсказка */
int i; /* введенное значение */
};

void input_xy(struct xyinput *info);

int main(void)
{
struct xyinput mess;
mess.x = 10;
mess.у = 10;
strcpy(mess.message, "Enter an integer: ");
clrscr();
input_xy(&mess);
printf("Your number squared is: %d.", mess.i*mess.i);
return 0;
}

/* вывод сообщения о подсказке в указанной позиции и ввод целочисленного значения */
void input_xy(struct xyinput *info)
{
gotoxy(info->x, info->y);
printf(info->message);
scanf ("%d", &info->i);
}

Программа использует функции clrscr() и gotoxy() для очистки экрана и позиционирования курсора соответственно. Обе функции используют заголовочный файл conio.h Функция типа input_ху() полезна, когда программа выводит различные куски информации. (Фактически, можно создать несколько функции типа input_xy(), вводящих другие типы данных.)