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

Операции над структурами

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

Вложенные структуры

Если одна структура содержится или "вложена" в другую, то говорят, что это вложенные структуры.

struct names{ char name[20];

char fio[20];};

struct worker{ struct names people;

char job[20];

float money;};

void main(void){

struct worker driver = {{"Иван", "Иванов"},

"водитель", 1234.1};

Для обращения к элементу вложенной структуры применяется две операции «точка».

puts(driver.people.name);

Указателями на структуры легче пользоваться, чем самими структурами. Структура не может передаваться в качестве аргумента функции, а указатель на структуру может.

struct worker *pdrv;

pdrv = &driver;

struct worker driver[2]; //массив структур

а) pdrv = driver; // pdrv <=> &driver[0];

pdrv+1 <=> &driver[1].

Доступ к элементу структуры осуществляется через операцию ->.

pdrv->job -> driver[0].job ->(*prdv).job

б) pdrv->people.name

1) Операция получения элемента.

driver.money=1234;

2) Операция косвенного получения элемента.

pdrv->money=3456;

1. Можно передавать элемент структуры в качестве параметра в функцию. Тогда функция не знает, что это структура.

struct funds{

char* bank;

float fonds;

char* name;

float savef;

}stan={"ПРБ", 1023.87, «Иванов И.И.», 123,45};

float sum (float, float);

void main(void){

printf ("У Иванова И.И.всего %.2f рубл.\n", sum(stan.fonds,stan.savef));

}

float sum(float x, float y){

return(x+y);

}

Функция sum() не знает, что ей передается элементы структуры, важно, что они имеют тип float.

2. Если нужно, чтобы она воздействовала на элемент структуры, то нужно передвать адрес элемента и далее работать через указатель определенного типа.

modify(&stan.savef);

3. Сообщение функции, что она имеет дело со структурой. Для этого нужно передать адрес структуры в качестве параметра.

struct funds {...} stan={...};

void main(void){

float sum (struct funds*);

printf ("У Иванова И.И. %.2f рублей\n", sum(&stan));

}

float sum (stuct funds* money){

return(money->fonds+money->savef);

}

Указатель money ссылается на структуру funds. В отличие от массива имя структуры не является её адресом, поэтому указываем адрес &stan.

4. Имеется массив структур. В этом случае имя массива является его адресом.

struct funds {...}stans[2]={{...},{...}};

void main(void){

float sum (struct funds*);

printf ("Всего капитала %.2f рублей\n", sum(stans));

}

float sum(struct funds* money){

float summ;

int i;

for (i=0, summ=0;i<2; i++, money++)

summ+=money->fonds+money->savef;

return (summ);

}

money <=> &stan[0]; увеличивается money++, ссылаемся на stan[1].

Пример 1. Определить номер дня в году.

struct date { int day; int month;

int year; int yearday;}d={25,3,1999};

int date_tab[2][13]={{ 0,31,28,31,30,31,30,31,31,30,31,30,31},

{ 0,31,29,31,30,31,30,31,31,30,31,30,31}};

int day_of_year(struct date *pd) {

int i, day, l=0;

day = pd->day;

if(pd->year%4==0&&pd->year%100!=0||pd->year%400==0) //год высок.

l=1;

for(i=0; i< pd->month; i++)

day+=date_tab[l][i];

return(day);

}

void main(void) {

d.yearday=day_of_year(&d); - вызов функции.

printf(“%d“, d.yearday);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: