Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 10554 / 332 | Оценка: 4.12 / 4.01 | Длительность: 19:18:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 7:

Производные типы данных языка C++. Массивы и указатели

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Аннотация: Описывается синтаксис и семантика объявления массивов, рассматривается их размещение в памяти, определяется доступ к элементам массива. Освещается применение символьных массивов и строк. Рассматривается работа с указателями, определяются указатели на переменные, константные указатели, указатели на указатели.

Производные типы

Производные типы можно условно подразделить на две группы:

  • Непосредственно производные типы. Эти типы являются производными от некоторых существующих типов, реализуя типы указателей, ссылки, функции преобразования типов. В группу непосредственно производных типов входят:
    • массивы
    • указатели
    • ссылки
    • перечисления
    • указатели на члены класса.
  • Составные производные типы. В группу составных производных типов входят:
    • классы
    • структуры
    • объединения

Массивы

Объявление массивов

Массив переменных или объектов состоит из определенного числа однотипных данных, называемых элементами массива. Все элементы массива индексируются последовательно, начиная с нуля.

Размещение элементов массива в памяти выполняется последовательно.

Количество элементов в массиве определяет размер массива и является константным выражением. Для создания динамических массивов стандартная библиотека C++ предусматривает тип vector.

Имя массива определяет адрес первого элемента массива.

Имя массива в отличие от имени вектора нельзя указывать в левой части оператора присваивания.

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

// Объявление одномерного массива
тип имя_массива[размерность_N];
// Объявление одномерного массива с 
// одновременной инициализацией
тип имя_массива[размерность_N]=
   {значение0, значение1, ..., значение_N-1};
// Объявление безразмерного массива с 
// одновременной инициализацией:
// размерность определяется количеством 
// значений, указанных в списке инициализации
тип имя_массива[]={значение0, значение1, 
   ..., значение_N-1};
// Объявление многомерного массива
тип имя_массива[размерность_1N]... 
   [размерность_MN];
// Объявление многомерного массива с 
// одновременной инициализацией
тип имя_массива 
   [размерность_N]... [размерность_M] =
   { {значение0, значение1, ..., значение_M-1},
     ... 
     {значение0N, значение1N, ..., значение_NM-1}};

Размерность массива может:

  • указываться любым константным выражением целого типа;
  • автоматически определяться компилятором по списку значений инициализации массива (если размерность не указана явно).

Например:

int arrayOfInteger[17];      
  // Массив из 17 переменных типа int
char arrayOfChar_3[3]={'L','M','N'};     
  // Объявление и инициализация 
  // символьного массива
char arrayOfChar_0[]={"Array of char. \n"};
int arrayOfInteger_6[2][3]=    {
   {1,2,3}, {11,12,13}};      
   // Объявление и инициализация 
   // двумерного массива

Если ни размерность массива, ни список значений инициализации не указаны, то будет создан массив нулевой длины.

Объявление многомерных массивов выполняется по следующим правилам:

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

Инициализацию массива можно выполнить одним из следующих способов:

  • указать во время объявления массива в фигурных скобках значения инициализации (начиная с нулевого элемента и первого столбца);
  • присвоить значение элементам массива во время выполнения программы;
  • объявить массив как глобальный или статический, инициализируемый по умолчанию (для числовых значений выполняется инициализация нулями, а для указателей - значением null ). Глобальный массив объявляется вне всех функций, а статический массив объявляется с модификатором static.

Если количество значений инициализации больше, чем объявленная размерность массива, то компилятор Visual C++ инициирует ошибку.

Если количество значений инициализации меньше, чем объявленная размерность массива, то оставшиеся значения автоматически инициализируются нулями.

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

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

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);

Ольга Баранова
Ольга Баранова
Россия, Тамбовская область
Евгений Шаров
Евгений Шаров
Россия, Североморск, школа№11, 1991