Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
http.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.34 Mб
Скачать

Передача структур в функции

Все структуры и массивы структур, используемые в примерах, или являются глобальными, или определяются в функциях, их использующих. Здесь подробно здесь подробно будет рассмотрена передача структур и их членов в функции.

Передача членов структур в функции

При передаче членов структур в функции фактически передается значение члена. Следовательно, передается обычная переменная. Рассмотрим для примера следующую структуру: struct fred { 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, как показано в последнем примере, оператор & необходим.

Передача всей структуры в функцию

Когда структура используется как аргумент функции, передается вся структура с помощью стандартной передачи по значению. Это означает, что любые изменения, внесенные в содержимое структуры внутри функции, не повлияют на структуру, используемую в качестве аргумента.

Когда структура используется как параметр, самое важное - это запомнить, что тип аргумента должен соответствовать типу параметра. Лучший способ сделать это - определить структуру глобально, а затем использовать ее ярлык для объявления необходимых структурных переменных и параметров. Например: #include <stdio.h> /* объявление типа структуры */ struct struct_type { int a, b; char ch; }; void f1(struct struct_type parm); int main(void) { struct struct_type arg;    /* объявление arg */ arg.a = 1000; f1(arg); return 0; } void f1(struct struct_type parm) { printf("%d", parm.a); } Данная программа выводит число 1000 на экран. Можно видеть, что как arg, так и parm объявлены как структуры типа struct_type.

Указатели на структуры

Язык С позволяет создавать указатели на структуры так же, как и на другие типы переменных. Тем не менее, имеется несколько аспектов, которые следует помнить.

Объявление указателя на структуру

Указатели на структуру объявляются путем помещения * перед именем структурной переменной. Например, предполагая, что ранее была определена структура addr, следующая строка объявляет addr_pointer как указатель на данные этого типа: struct addr *addr_pointer;

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

Для получения адреса структурной переменной следует поместить оператор & перед именем структуры. Пусть имеется следующий фрагмент 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(), вводящих другие типы данных.)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]