Структура как базовый тип данных
Для базовых типов данных определены операции присваивания, они могут быть также формальными параметрами и результатом функции. Аналогичные действия могут выполняться в Си++ над структурами:
- операция ПРИСВАИВАНИЯ СТРУКТУРИРОВАННЫХ ПЕРЕМЕННЫХ производит побайтное копирование одной структуры в другую. Присваивание возможно также при косвенном обращении по указателю на структуру;
- ФОРМАЛЬНЫЙ ПАРАМЕТР СТРУКТУРИРОВАННАЯ ПЕРЕМЕННАЯ : имеет место способ передачи параметра по значению: в стеке резервируется место для размещения структуры -формального параметра и производится присваивание ей значения фактического параметра (копирование);
- РЕЗУЛЬТАТ ФУНКЦИИ СТРУКТУРИРОВАННАЯ ПЕРЕМЕННАЯ : при выполнении оператора return в такой функции значение операнда -структуры присваивается структурированной переменной, использующей результат функции. При отсутствии непосредственного присваивания результата транслятор создает неявную автоматическую структурированную переменную , в которой временно его сохраняет. Функция, возвращающая структуру в качестве результата, может иметь неявный параметр -адрес размещения результата (указатель);
-в обозначении типа данных -структуры служебное слово struct можно опускать.
В приведенном примере все механизмы передачи параметров и результата интерпретируются средствами " классического" Си:
.
struct dat { int day,month,year; };
//-------------------------------------------------------
// Си++ Эквивалент в "классическом" Си
//-------------------------------------------------------
dat COPY(dat x) void COPY(dat *ret, dat x)
{ {
return(x); *ret = x;
}; };
void main() void main()
{ {
dat a1,a2,a3,*p; dat a1,a2,a3,*p;
//----- Прямое присваивание структур -----------------
a1 = a2; a1 = a2;
//----- Присваивание структур косвенно по указателю --
p = &a3; p = &a3;
*p = a2; *p = a2;
//----- Прямое присваивание результата - структуры ---
a1 = COPY(a2); a2 = x;
ret = &a1;
*ret = x;
//----- Неявная структурированная переменная ---------
a1 = COPY(COPY(a2)); dat dummy;
x = a2;
ret = &dummy;
*ret = x;
x = dummy;
ret = &a1;
*ret = x;
} }