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




Доступ к членам структуры

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

 




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: