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

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

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >

Размещение массива в памяти

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

Например, для массива char aCh[2][4] будет выделено восемь байтов памяти, в которых в следующем порядке будут размещены элементы массива:

элемент aCh[0][0] aCh[0][1] aCh[0][2] aCh[0][3] aCh[1][0] aCh[1][1] aCh[1][2] aCh[1][3]
N байта 1 2 3 4 5 6 7 8

Двухмерные массивы можно рассматривать как матрицу, в которой первый индекс определяет строку, а второй индекс - столбец. Порядок расположения элементов матрицы в памяти - по строкам.

При размещении трехмерного массива char aCh[3][2][5] память под элементы этого массива будет выделяться последовательно в соответствии со следующими значениями индексов:


Рис. 7.1.

Общий объем выделяемой под массив памяти определяется как произведение всех размерностей массива (общее число элементов), умноженное на длину типа данных массива.

Элементы массива

Доступ к элементам массива может выполняться:

  • по указателю на массив и индексу элемента, задаваемого в квадратных скобках: первый элемент массива имеет индекс 0;
  • по указателю на элемент массива.

Для получения адреса элемента массива применяется оператор &.

Имя массива является адресом массива и эквивалентно следующему выражению: &имя_массива[0].

Для определения размерности массива в байтах можно использовать функцию sizeof(имя_массива).

Например:

arrayOfInteger[0]=1;        
  // Присваивание значения
  // первому элементу массива
iInt1=arrayOfInteger[1]=13;        
  // Групповое присваивание
iInt2=&arrayOfInteger[4];        
  // Получение адреса пятого 
  // элемента массива

Символьные массивы и строки

Синтаксис языка не имеет простого строкового типа (стандартная библиотека содержит тип string, но переменные данного типа не являются массивами символов). Поэтому для работы со строками удобно использовать массивы символов. Объявить массив символов - строку можно двумя способами:

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

Символом конца строки служит null-символ \0. При подсчете числа символов в строке учитывается общее число символов плюс символ конца строки.

Например:

char arrayOfChar[6];
arrayOfChar[0]='A';  
  // Доступ через указатель 
  // на массив и индекс
char * ph = arrayOfChar;   
  // Создание указателя на элемент массива
ph++;                        
  // Переход к следующему элементу массива

Префиксный оператор * называется оператором разыменования. Если ph указывает на элемент массива, то *ph является значением этого элемента.

Любое выражение, имеющее тип массива, может быть преобразовано к указателю того же типа: результатом будет указатель на первый элемент массива.

Например:

char cStr[_MAX_PATH];     
  // Массив типа char
char *pStr = cStr;       
  // Указатель на массив:
  // эквивалентно выражению &cStr[0]
< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Александр Демьяненко
Александр Демьяненко

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

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

Добрый день!

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

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

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

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