Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4104

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть 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}} */ 

Но  операторы  присваивания  в  следующем  примере  вызовут 
ошибку, т. к. имя массива является именованной константой и не 
может принимать нового значения. 


background image

Глава 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,  при 
условии совпадения типа элементов и диапазонов массивов. 
Массивы,  которые  объявляются  в  программе  явно,  также  назы-
ваются 

встроенными

 или 

статическими массивами

 


background image

  

 
 

Г Л А В А  

 
 
 

Функции 

 

6.1. Объявление функции 

Функция

  —  это  последовательность  инструкций,  предназначен-

ных для решения определенной задачи. Прежде чем функция мо-

жет  использоваться  в  программе,  она  должна  быть  объявлена.  То 

есть  до  инструкции  с  вызовом  функции  в  тексте  программы 

должно  находиться 

объявление  функции

,  которое  имеет  следую-

щий вид: 

  спецификатор_типа имя_функции(список_параметров); 

и описывает соответственно тип возвращаемого функцией значе-

ния,  имя  функции  и  список  параметров.  Тип  возвращаемого 

функцией  значения  не  может  быть  типом  статического  массива 

или  именем  функции.  Параметры  функции  перечисляются  в 

скобках через запятую. Например, объявление функции, которая 

вычисляет  сумму  двух  целых  чисел,  может  выглядеть  следую-

щим образом: 

  int add(int x, int y); 

Если функция не возвращает значения, то предполагается, что эта 

функция  возвращает  пустое  значение.  В  этом  случае  для  типа 
возвращаемого значения используется тип 

void

. Например: 

  void print(int a); 

Если  тип  возвращаемого  значения  пропущен,  то  считается,  что 
функция возвращает значение типа 

int

 (но это очень старое пра-

  

 


background image

Глава 6. Функции 

79 

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

  print(int х, int y); 

возвращает значение типа 

int

 

В языке программирования C++ определение функции должно со-

держать спецификатор типа возвращаемого значения. Однако не-

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

Если в объявлении функции указаны только типы параметров, то 

такое  объявление  функции  называется 

прототипом  функции

Например, прототип функции 

add

 имеет следующий вид: 

  int add(int, int); 

Если функция не имеет аргументов, то в списке параметров этой 
функции  нужно  указать  слово 

void

.  Пустой  список  параметров 

обозначает, что функция имеет неопределенное количество пара-

метров. То есть в этом случае функцию можно вызвать с любым 

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

 

В языке программирования C++ как пустой список параметров, так 
и  список  параметров,  содержащий  только  слово 

void

,  обознача-

ют, что функция не имеет параметров. 

Учитывая замечание, в языке программирования С++ следующая 

функция: 

  void hello(); 

не имеет параметров и не возвращает никакого значения. 
В  языке  программирования  С  допускается  использование  функ-

ций с переменным количеством параметров. В этом случае в кон-

це  списка  параметров  ставится  многоточие.  При  этом  в  списке 

параметров  должен  присутствовать  хотя  бы  один  параметр.  На-

пример, можно объявить следующую функцию: 

  int add_num(int n, ...);  /* n - количество слагаемых */ 

которая,  как  предполагается,  находит  сумму  произвольного  ко-
личества целых чисел. 


background image

Часть I. Язык программирования С 

80 

 

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

,

 

(за-

пятая)  перед  многоточием  при  объявлении  функции  с  неопреде-
ленным  количеством  параметров.  Также  в  С++  допускается  ис-
пользовать  в  списке  параметров  просто  многоточие,  которое  в 
этом случае указывает на то, что функция имеет неопределенное 
количество параметров. 

Подробно  работа  с  функциями,  имеющими  неопределенное  ко-
личество параметров, рассмотрена в 

гл. 23

6.2. Определение функции 

Определение функции

 имеет следующий вид: 

  спецификатор_типа имя функции(список_параметров) 
  { 
    /* тело функции */ 
  } 

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

return

, которая имеет следующий синтаксис: 

  return выражение; 

После выполнения инструкции 

return

  исполнение  функции  пре-

кращается и функция возвращает значение 

выражения

. Перед воз-

вратом из функции все побочные эффекты, возникающие при вы-
числении 

выражения

, завершаются. Тип 

выражения

 должен соответ-

ствовать  типу  возвращаемого  функцией  значения.  В  противном 
случае выполняется неявное приведение типов. 


Смотрите также файлы