- •Адреса, указатели, ссылки, массивы Указатели и адреса объектов
- •Объявление и инициализация указателей
- •Инициализация указателей
- •Указатели константы и на константы
- •Типы указателей и операции над ними
- •Указатели на основные типы данных - на арифметические данные и на символьные.
- •Операции над указателями
- •Понятие указателя на указатель
- •Аддитивные операции
- •I. Вычитание
- •Вычитание из указателя целое число:
- •II. Сложение указателя с целым значением
- •Объявление ссылки
- •Инициализация ссылок не обязательна:
- •Массивы
- •Форма объявления одномерного массива (вектора) type имя массива [k];
- •Type имя массива [ k 1] [ k2] …[kn];
- •Внутреннее представление массивов в оперативной памяти
- •Инициализация числовых и символьных массивов.
- •Инициализации символьных массивов
- •Массивы и указатели
- •Указатели и строки
- •Ввод/вывод элементов массивов Ввод/вывод числовых массивов
- •Ввод/вывод символьных массивов
- •Создание динамических массивов.
- •Имя указателя [индекс элемента]
- •Массивы указателей
- •Создание двумерного динамического массива с помощью динамического массива указателей.
- •Указатель на массив. Многомерные массивы динамической памяти.
- •Определение типа массива
- •Определение типа указателя на массив
Массивы и указатели
Имя массива воспринимается двояко на этапе определения массива и на этапе его использования.
С одной стороны, имя массива следует рассматривать как имя структурированной переменной.
И применение таких операций как sizeof и & к имени массива дают в качестве результата соответственно размер внутреннего представления в байтах всего массива и адрес первого элемента массива:
sizeof(имя массива) – размер массива в байтах;
&имя массива - адрес массива в целом, равный адресу первого элемента.
С другой стороны, имя массива - это константный указатель, значением которого является адрес первого элемента массива и значение данного указателя нельзя изменять!!!.
Рассмотрим одномерный массив. В соответствии с вышесказанным соблюдается равенство:
имя_массива = = &имя_массива = = &имя_массива[0],
то есть, имя массива отожествляется с адресом массива в целом и с адресом его первого элемента.
То, что имя массива - это указатель на первый элемент позволяет сформулировать еще один способ обращения к элементам массива.
В соответствии с операцией сложения указателя с целым числом, если к имени массива (константному указателю) прибавить целое число i:
имя_массива +i ,
то на машинном уровне сформируется следующее значение адреса:
имя_массива + i * sizeof(тип элемента),
которое равно адресу i–го элемента массива:
имя_массива + i = = &имя_массива[ i ].
Операция разыменования адреса объекта предоставляет доступ к самому объекту.
Применяя операцию разыменования для левой и правой части представленного выше уравнения, получаем результат:
*(имя_массива + i) = = имя_массива[ i ],
из которого следует, что обращаться к i-муэлементу массива можно любым из этих эквивалентных способов.
имя[индекс] или *(имя+индекс)
Многомерные массивы рассмотрим на примере объявления двумерного массива:
type T [m][n];
m, n– целочисленные константы,
type– тип элемента массива.
В массиве m строк по n элементов в строке (n столбцов).
Имя двумерного массива T также отожествляется с его адресом, а также с адресом его первого элемента Т[0][0].
Каждая строка двумерного массива - это одномерный массив с именем T[i], где i– индекс строки, и имя этого массива является адресом первого элемента строки и адресом строки в целом.
Таким образом, адреса строк массива равны:
T[0], T[1],…,T[m-1],
и, как показано выше, эквивалентны следующим выражениям:
*T, *(T+1),…,*(T+m-1).
Выражения:
T[i] = = *(T+i) = =&T[i][0]
– представляют адрес i –строки массива, и, следовательно, обращаться к элементу i –ой строки j-го столбца массива можно следующими способами:
T[i][j] = = *(*(T+i)+j)==*(T[i]+j)==(*(T+i))[j]
Указатели и строки
Как и массивы типа char, указатели char* могут инициализироваться строковыми константами:
char * имя_1 = ''строка'';
char * имя_2 = {''строка''};
char * имя_3(''строка'');
В операторе вывода будет выводиться не адрес строки, а по значению указателя выведется сама строка до байтового нуля:
cout<< имя указателя на строку;
Если надо вывести адрес строковой константы, при выводе надо воспользоваться приведением типа указателя к void*:
cout<< (void*) имя указателя на строку;
Если надо представлять в программе группу текстовых строк, целесообразно объявить массив указателей типа char* по количеству строк:
char* name [5]= {''Иванов'', ''Петров'', ''Розен'', ''Цой'', ''Григорьев''};
Адреса отдельных строк равны значениям указателей из массива:
name[0], name[1], name[2], name[3], name[4].
По адресам выводим строки:
for (int i=0; i< 5; i++) cout<< name[i] <<endl;
Благодаря манипулятору endl фамилии выведутся в столбик.
