ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4247
Скачиваний: 28
Часть I. Язык программирования С
76
Можно использовать вложенные фигурные скобки, которые раз-
бивают список значений элементов массива на строки. Например:
int a[2][2] = {{1, 1}, {2, 2}};
Если многомерный массив инициализируется при объявлении, то
диапазон значений первого индекса можно опустить. В этом слу-
чае компилятор сам вычислит диапазон первого индекса в зави-
симости от количества констант, используемых для инициализа-
ции. Например:
int a[][2] = {{1, 1}, {2, 2}};
При инициализации элементов многомерных массивов действуют
те же правила, что и при инициализации элементов одномерных
массивов. Но при этом следует отметить, что отсутствующие
элементы многомерного массива инициализируются нулями в
соответствии с вложенностью фигурных скобок. То есть:
int a[2][2] = {1, 1}; /* a[1][0] = 0, a[1][1] = 0 */
не эквивалентно:
int a[2][2] = {{1}, {2}}; /* a[0][1] = 0, a[1][1] = 0 */
Для доступа к элементам многомерного массива используется
оператор индексирования
[]
. Причем этот оператор должен при-
меняться столько раз, какова размерность многомерного массива.
Например:
int a[2][2] = {{1, 2}, {3, 4}};
int n = a[1][1]; /* n = 4 */
Если оператор индексирования применяется меньшее число раз,
то это в результате дает массив меньшей размерности. Например:
int a[2][2][2] = {{{1, 1}, {2, 2}}, {{3, 3}, {4, 4}}};
int *b;
int (*c)[2];
b = a[1][1]; /* b = {4, 4} */
c = a[1]; /* c = {{3, 3}, {4, 4}} */
Но операторы присваивания в следующем примере вызовут
ошибку, т. к. имя массива является именованной константой и не
может принимать нового значения.
Глава 5. Указатели и массивы
77
int a[2][2][2] = {{{1, 1}, {2, 2}}, {{3, 3}, {4, 4}}};
int b[2];
int c[2][2];
b = a[1][1]; /* ошибка, так как b - константа */
c = a[1]; /* ошибка, так как c - константа */
В этом случае необходимо поэлементное копирование элементов
массива
a
в массивы
b
и
c
.
В языке программирования C++ многомерные массивы имеют
следующий тип:
спецификатор_типа[диапазон_1]...[диапазон_n]
Однако такой тип неявно приводится компилятором к типу мас-
сива, который используется в языке программирования C, при
условии совпадения типа элементов и диапазонов массивов.
Массивы, которые объявляются в программе явно, также назы-
ваются
встроенными
или
статическими массивами
.
Г Л А В А
6
Функции
6.1. Объявление функции
Функция
— это последовательность инструкций, предназначен-
ных для решения определенной задачи. Прежде чем функция мо-
жет использоваться в программе, она должна быть объявлена. То
есть до инструкции с вызовом функции в тексте программы
должно находиться
объявление функции
, которое имеет следую-
щий вид:
спецификатор_типа имя_функции(список_параметров);
и описывает соответственно тип возвращаемого функцией значе-
ния, имя функции и список параметров. Тип возвращаемого
функцией значения не может быть типом статического массива
или именем функции. Параметры функции перечисляются в
скобках через запятую. Например, объявление функции, которая
вычисляет сумму двух целых чисел, может выглядеть следую-
щим образом:
int add(int x, int y);
Если функция не возвращает значения, то предполагается, что эта
функция возвращает пустое значение. В этом случае для типа
возвращаемого значения используется тип
void
. Например:
void print(int a);
Если тип возвращаемого значения пропущен, то считается, что
функция возвращает значение типа
int
(но это очень старое пра-
Глава 6. Функции
79
вило, касающееся языка С и сейчас, как правило, оно не исполь-
зуется). Например, следующая функция:
print(int х, int y);
возвращает значение типа
int
.
В языке программирования C++ определение функции должно со-
держать спецификатор типа возвращаемого значения. Однако не-
которые компиляторы могут не поддерживать это требование.
Если в объявлении функции указаны только типы параметров, то
такое объявление функции называется
прототипом функции
.
Например, прототип функции
add
имеет следующий вид:
int add(int, int);
Если функция не имеет аргументов, то в списке параметров этой
функции нужно указать слово
void
. Пустой список параметров
обозначает, что функция имеет неопределенное количество пара-
метров. То есть в этом случае функцию можно вызвать с любым
списком аргументов, которые функция будет извлекать из стека.
В языке программирования C++ как пустой список параметров, так
и список параметров, содержащий только слово
void
, обознача-
ют, что функция не имеет параметров.
Учитывая замечание, в языке программирования С++ следующая
функция:
void hello();
не имеет параметров и не возвращает никакого значения.
В языке программирования С допускается использование функ-
ций с переменным количеством параметров. В этом случае в кон-
це списка параметров ставится многоточие. При этом в списке
параметров должен присутствовать хотя бы один параметр. На-
пример, можно объявить следующую функцию:
int add_num(int n, ...); /* n - количество слагаемых */
которая, как предполагается, находит сумму произвольного ко-
личества целых чисел.
Часть I. Язык программирования С
80
В языке программирования С++ допускается опускать символ
,
(за-
пятая) перед многоточием при объявлении функции с неопреде-
ленным количеством параметров. Также в С++ допускается ис-
пользовать в списке параметров просто многоточие, которое в
этом случае указывает на то, что функция имеет неопределенное
количество параметров.
Подробно работа с функциями, имеющими неопределенное ко-
личество параметров, рассмотрена в
гл. 23
.
6.2. Определение функции
Определение функции
имеет следующий вид:
спецификатор_типа имя функции(список_параметров)
{
/* тело функции */
}
и состоит из заголовка, который совпадает с объявлением функ-
ции, и тела функции, которое заключено в блок. Тело функции
содержит определения и инструкции, которые выполняются при
вызове функции. В отличие от объявления функции, которое мо-
жет располагаться в любом месте программы, определение функ-
ции должно находиться вне блока. Поэтому обычно функции оп-
ределяются в начале программы. Если определение функции
встречается до ее использования, то оно также является и объяв-
лением этой функции.
Для возврата из функции значения используется инструкция
return
, которая имеет следующий синтаксис:
return выражение;
После выполнения инструкции
return
исполнение функции пре-
кращается и функция возвращает значение
выражения
. Перед воз-
вратом из функции все побочные эффекты, возникающие при вы-
числении
выражения
, завершаются. Тип
выражения
должен соответ-
ствовать типу возвращаемого функцией значения. В противном
случае выполняется неявное приведение типов.