Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Программированию.doc
Скачиваний:
70
Добавлен:
11.02.2015
Размер:
1.22 Mб
Скачать

Ссылка в качестве возвращаемого значения

Возвращаемое функцией значение также может быть объявлено ссылкой. Это позволяет использовать функцию в левой части присваивания. Рассмотрите такой пример:

////////////////////////////////////////////////////////

#include <stdio.h>

#include <assert.h>

const int arrSize = 8;

int &refItem(int indx) // Возвращает ссылку на элемент iArray[indx]

{

static int iArray[arrSize];

// Проверка диапазона:

// Tests a condition and possibly aborts. assert is a macro that expands

// to an if statement; if test evaluates to zero, the assert macro calls

// the _assert function and aborts the program

assert(indx >= 0 && indx< arrSize);

return iArray[indx];

}

int main()

{

for (int i =0; i<arrSize; i++)

refItem(i) = 1 << i;

// Присваивает значение элементу iArray[i].

for (int i=0; i<arrSize; i++)

printf("iArray[%02d] = %4d\n”, i, refItem(i));

return 0;

}

Вывод:

iArray[00] = 1

iArray[01] = 2

iArray[02] = 4

iArray[03] = 8

iArray[04] = 16

iArray[05] = 32

iArray[06] = 64

iArray[07] = 128

В первом из операторов for функция refltem() вызывается в левой части присваивания. Во втором for она возвращает значение, которое передается функции printf (). Обратите внимание, что, во-первых, массив iArray[] объявлен как статический локальный в refltem(), благодаря чему непосредственное обращение к нему вне этой функции невозможно. Во-вторых, refltem() попутно проверяет допустимость переданного ей индекса.

Пример 2. Функция удвоения:

#include <stdio.h>

void mul2(int a, int &b);

int main(int argc, char* argv[])

{

int a=2, b=3;

printf("1. a=%d b=%d\n", a, b); //2 3

mul2(a, b);

printf("3. a=%d b=%d\n", a, b); //2 6

getchar();

return 0;

}

void mul2(int a, int &b)

{

a*=2;

b*=2;

printf("2. a=%d b=%d\n", a, b); //4 6

}

Передача массивов

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

Размер массива неважен при объявлении параметра. Все три приведенные записи

void f(int*);

void f(int[]);

void f(int[10]);

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

void f(int[10], int size);

Другой способ сообщить функции размер массива-параметра — объявить параметр как ссылку. В этом случае размер становится частью типа, и компилятор может проверить аргумент в полной мере.

void f(int (&arr)[10]);

Для передачи массива по значению можно его поместить в структуру, которая содержит единственное поле — сам массив.

#include <stdio.h>

typedef struct

{

int a[1];

} S;

void f(int a[])

{

a[0]=2;

}

void f2(S x)

{

x.a[0]=2;

}

int main(int argc, char* argv[])

{

int a[1]={1};

printf("%d\n", a[0]);

f(a);

printf("%d\n", a[0]);

S t;

t.a[0]=1;

printf("%d\n", t.a[0]);

f2(t);

printf("%d\n", t.a[0]);

getchar();

return 0;

}