Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AllCandC++Lectures.docx
Скачиваний:
2
Добавлен:
25.09.2019
Размер:
52.56 Кб
Скачать

Определение и инициализация переменных

Есть несколько методов описания переменных структурного типа:

1) struct complex {

float real;

float imagine; };

Для определения переменных можно использовать имя структурного типа. Можно совместить объявление структурного типа с определением переменных:

struct complex {

float real;

float imagine;

} z, *pz, az[10];

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

Инициализация

На инициализацию структурных переменных распространяются многие правила обычной инициализации. Например: структурные переменные, объявленные на глобальном уровне или как статические, по умолчанию обнуляются. Явная инициализация может быть полной или неполной, структурированной и неструктурированной.

struct complex z1={1.2, 3.4}, z2={-5.8};

В случае неполной инициализации оставшиеся поля остаются неинициализированными.

struct complex z[2]={1.2, 3.4, -5.8};

z[0]. real <- 1.2

z[0].imagine <-3.4

структурированная: struct complex z[2]={1.2, 3.4, -5.8};

struct complexz[2]={ {1.2}, {3.4, -5.8}};

Доступ к полям структуры

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

struct complex z={0.3, 2.1};

printf("real=%f\n imagine=%f", z.real, z.imagine);

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

struct complex z={0.3, 2.1}, *pz=&z;

Операция точка позволяет обратиться к полям через объект (*pz).real, (*pz).imagine

Если есть указатель, то объект можно получить разыменованием и затем использовать точку. Чтобы упростить синтаксис, в C имеется операция стрелка, которая позволяет обращаться к полям прямо через указатель: pz--> real, pz--> imagine.

Функции и структуры

Структурные типы могут использоваться как для описания формальных параметров функции, так и для ее возвращаемого значения. Правила передачи структурных переменных в функции обычные для C. Структуры передаются значением, т.е при вызове функции значения фактического параметра копируются в аргумент функции. Если структурный тип объемный, то эта операция потребует памяти и времени. Поэтому, часто структуры передаются в функции с помощью указателей. В этом случае, внутри функции мы будем работать со структурой являющейся фактическим аргументом.

Примеры:

1) передача значением:

struct complex {

float re;

im;};

Определим функцию add, которая выполняет сложение двух комплексных переменных и возвращает результат сложения.

struct complex add( struct complex z1, struct complex z2) {

struct complex z;

z.re=z1.re+z2.re;

z.im=z1.im+z2.im;

return z;

}

struct complex a, b1={1.2}, b2={3.4};

a=add(b1,b2);

При вызове функции значение b1 копируется в z1, b2 в z2.

Этот пример показывает, что переменным структурного типа можно присваивать значения структурного типа или просто переменные структурного типа.

2) передача в функцию по ссылке

struct complex add1 ( struct complex *pz1, struct coplex *pz2) {

struct complex z;

z.re=pz1-->re+pz2-->re;

z.im=pz1-->+pz2--im;

return z;

}

вызов будет таким:

a=add1(&b1,&b2);

В этом случае, при вызове функции в аргументы pz1 и pz2 копируются адреса структур, b1 и b2. А внутри функции мы работаем с оригиналами этих структур.

3) функция add2 получает три аргумента: два указателя на слагаемые и указатель на результат. Функция никаких значений не возвращает.

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