Передача структуры в функцию
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);
}
Объединения
Объединения - это средство, позволяющее запоминать данные различных типов в одном и том же месте памяти. Объединение позволяет создавать массив, состоящий из элементов одинакового размера, каждый из которых может содержать различные типы данных.
Определяется также как и структура. Кючевое слово union. Есть шаблон определения и переменные этого типа.
union simbl {
int digit;
double bigfl;
char letter;
};
union simbl fit, save[10], *pu.
Компилятор выделяет память по наибольшему из элементов объединения bigfl (double 8 байт), для массива структур save[10] будет выделено (10 x 8) байт.
Как обращаться к элементу объеденения?
fit.digit=23; (использ. 2байта)
fit.bigfl=2.0 (23 стирается и записывается 2.0)
fit.letter='a' (2.0 стирается и записывается'a'в 1байт)
pu=&fit; x=pu->digit;
Все типы объединения начинаются с одного и того же адреса и в данный момент можно обратиться только к одному данному объединения.
В С++ можно создавать «безымянные» объединения. В объявлении безымянного объединения отсутствует как тег объединения, так и список объектов этого типа:
union {
int digit;
double bigfl;
char letter;
};
После появления такого объявления имена членов объединения могут использоваться подобно именам обычных переменных; при этом они все расположены в памяти, начиная с одного адреса.
digit=23;
bigfl=2.0
Безымянные объединения очень удобно использовать в качестве членов структур.
Синоним имени типа
Встречаются ситуации, когда удобно ввести синоним для имени некоторого типа.
Строится синоним имени с помощью ключевого слова typedef.
Примеры:
typedef int INT //INT-синоним типа int
INT x, y;
typedef unsigned size_t;
size_t x, y; //переменная типа unsigned
typedef char string[225];
string array; //char array[225];
1. Функция typedef даёт имена типам данных.
2. Выполняется компилятором.
3. Более гибка, чем #define.
Испоьзование типа real вместо float:
typedef float real;
real x, y[5], *px;
если определение расположено внутри функции, то область действия локальна, вне функции глобальна.
typedef char* STRING //STRING-идинтификатор указателя на тип char.
STRING name, sign; //char*name,*sign;