Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП 2012.doc
Скачиваний:
31
Добавлен:
24.09.2019
Размер:
300.54 Кб
Скачать

12) Параметры структурных типов.

Имя структуры не является указателем на нее.

Пример 1. Сумма элементов массива (указатель).

struct mas{int n; int a[10]; int s;} massiv;

int summa(struct mas *x)

{ int i,s=0; for(i=0;i<x->n;i++) s+=x->a[i]; x->s=s; return s;}

Вызов: summa(&massiv);

Пример 2. Сумма элементов массива (ссылка).

struct mas{int n; int a[10]; int sum;} massiv;

int summa(struct mas &x)

{ int i,s=0;for(i=0;i<x.n;i++) s+=x.a[i]; x.s=s; return s;} Вызов: summa(massiv);

Параметры сложных структурных типов

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

Тогда, допустимы следующие варианты описания параметров-массивов:

а) int x[5] Û int x[] Û int *x // размерность проверяться не будет

б) int y[4][8] Û int y[][8] // будет проверяться размерность массива // только по второму размеру

При этом если в функцию передается массив, значения которого не должны меняться внутри функции, его следует описать как const, например:

int k23(const int *a);

Параметры – строки. При разработке функций, работающих со строками, обычно используют прием, который применяется в стандартных функциях обработки строк: обес-

печение возможности вызова функций как процедур и как функций. Это достигается тем,что адрес результирующей строки дублируется и возвращается еще и как результат функции. Примеры.Написать подпрограмму удаления ≪лишних≫ пробелов: strdel(st,st2); // вызов подпрограммы как процедры; puts(strdel(st,ptr2)); // вызов подпрограммы как функции

3. Параметры-структуры. В отличие от массивов и строк переменная типа ≪струкура≫ не является указателем, поэтому если структура передается в качестве параметра, то

для нее действуют те же правила, как и для скалярных значений. для передачи в подпрограмму параметров типа ≪структура≫, значения которых необходимо вернуть в вызывающую программу, необходимо использовать ссылки или указатели. В случае, когда изменение полей структуры не требуется, рекомендуется для исключения лишнего копирования всей структуры передавать её по ссылке со спецификатором const. Реализовать передачу изменяемой структуры в подпрограмму можно с использованием указателя или ссылки. Результат будет одинаков, а вот синтаксис описания и вызова

подпрограммы будут отличаться.

13) Классы памяти переменных.

1. Автоматические переменные (auto)(Две разные переменные)

main(){auto int a;…}abc() {auto int a;…}

2. Внешние переменные (extern)(Одна и та же переменная)

E xtern int a;

main()

{extern int a;…}

abc()

{extern int a;…}

bcd()

{int a;…}

3. Статические переменные (static)( В отличие от автоматической статическая переменная увеличивается с каждым вызовом)

abc()

{ int a=1; static int b=1;

… a++; b++; …}

4. Внешние статические переменные (extern static)(Внешняя переменная доступна во всех файлах программы, а внешняя статическая только в том файле, где описана)

int a;

extern static int b;

Файл

5. Регистровые переменные (register) (как и автоматическая, только по возможности размещается в регистре)

register int a;

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