
- •Приложение г Лекция 1. Элементы Языка си Используемые символы
- •Константы
- •Идентификаторы
- •Ключевые слова
- •Использование комментариев в тексте программы
- •Лекция 2. Типы данных и их объявление
- •Категории типов данных
- •Целый тип данных
- •Данные вещественного типа
- •Указатели
- •Операции разадресации и адреса
- •Переменные перечислимого типа
- •Лекция 3. Выражения и присваивания Операнды и операции
- •Преобразования при вычислении выражений
- •Операции отрицания и дополнения
- •Операция sizeof
- •Мультипликативные операции
- •Аддитивные операции
- •Операции сдвига
- •Поразрядные операции
- •Логические операции
- •Операция последовательного вычисления
- •Условная (тернарная) операция
- •Операции увеличения и уменьшения
- •Простое присваивание
- •Составное присваивание
- •Приоритеты операций и порядок вычислений
- •Побочные эффекты
- •Преобразование типов
- •Лекция 3. Операторы
- •Оператор выражение
- •Пустой оператор
- •Составной оператор
- •Оператор if
- •Оператор switch
- •Оператор break
- •Оператор while
- •Оператор do while
- •Оператор for
- •Сумма чисел от 1 до 100
- •Микрожизнь
- •Оператор continue
- •Оператор return
- •Оператор goto
- •Лекция 4. Массивы
- •Поиск минимума, сортировка
- •Ввод-вывод, обнуление
- •Двумерный массив
- •Лекция 5. Структуры
- •Объединения (смеси)
- •Поля битов
- •Переменные с изменяемой структурой
- •Определение объектов и типов
- •Лекция 6. Инициализация данных
- •Определение и вызов функций
- •Ссылки как псевдонимы переменных
- •Ссылки в качестве параметров функции
- •Ссылка в качестве возвращаемого значения
- •Передача массивов
- •Прототип
- •Указатели на функцию
- •Рекурсия
- •Предварительная инициализация параметров функции
- •Функции с переменным числом параметров
- •Передача параметров функции main
- •Исходные файлы и объявление переменных
- •Объявления функций
- •Время жизни и область видимости программных объектов
- •Лекция 7. Инициализация глобальных и локальных переменных
- •Методы доступа к элементам массивов
- •Указатели на многомерные массивы
- •Операции с указателями
- •Массивы указателей
- •Лекция 8. Динамические объекты
- •1. Выделение памяти в соответствие с типом указателя
- •2. Выделение памяти под нетипизированный указатель
- •Лекция 9. Динамическое создание и уничтожение массивов
- •Директивы Препроцессора
- •Директива #include
- •Директива #define
- •Директива #undef
- •Лекция 10. Условные директивы препроцессора
- •Линейный односвязный список
- •Лекция 11. Объектно-ориентированный подход к программированию
- •Ссылки на Себя
- •Инициализация
- •Копирующий конструктор
- •Очистка
- •Законченный Класс
- •Доступ к членам
- •Статические Члены
- •Лекция 12. Наследование
- •Перегрузка Операций
- •Операции Преобразования
- •Стандартный ввод/вывод
- •Форматируемый вывод
- •Манипуляторы
- •Ввод-вывод двоичных данных
- •Ввод/вывод с диска
- •Ввод/вывод для типов данных, определенных пользователем
- •Шаблоны функций
- •Шаблоны классов
- •Лекция 14. Библиотека stl
- •Итераторы
- •Алгоритмы
- •Контейнеры
- •Функциональные объекты
- •Пример. Работа с контейнером vector
- •Пример 2. Алгоритмы и функциональные объекты
- •Лекция 15. Обработка исключительных ситуаций
- •Лекция 16. Rtti и приведение типов
- •Операция typeid
Ссылка в качестве возвращаемого значения
Возвращаемое функцией значение также может быть объявлено ссылкой. Это позволяет использовать функцию в левой части присваивания. Рассмотрите такой пример:
////////////////////////////////////////////////////////
#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;
}