Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
указатели_new - копия.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
233.08 Кб
Скачать

Массивы и указатели

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

С одной стороны, имя массива следует рассматривать как имя структурированной переменной.

И применение таких операций как 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 фамилии выведутся в столбик.