Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
___2_Пособие по Языку С++.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.34 Mб
Скачать

5.2. Указатели и массивы

Массив - это совокупность элементов одного типа, которые расположены в памяти ЭВМ подряд, один за другим.

Признаком объявления массива являются квадратные скобки. Объявить массив из 10 элементов типа float можно так:

float a[10];

Чтобы обратиться к элементу этого массива, нужно применить операцию индексирования a[ind]. Внутри квадратных скобок помещается целое выражение, которое называется индексом. Нумерация элементов массива начинается с 0 и поэтому вышеприведенное описание говорит о том, что в памяти ЭВМ зарезервировано место под 10 переменных типа float и эти переменные есть a[0], a[1], . . . , a[9].

Приведем пример с использованием массива.

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

Число пробельных символов будем хранить в nwhite, прочих символов - в nother, а число появлений каждой из цифр - в массиве ndigit:

# include <iostream.h>

void main( ) {

int c, i, nwhite = 0, nother = 0;

int ndigit [10];

for ( i=0; i<10; i++) ndigit[i]=0;

while ( ( c=cin.get( ) )!=EOF)

if(c>=‘0’ && c<=‘9’) ++ ndigit[c – ’0’];

else if (c = = ‘ ‘|| c = = ‘\n‘ || c = = ‘\t‘) ++ nwhite;

else ++ nother;

cout<<“ цифра \n”;

for( i=0; i<10; i ++)

cout<<i<<“ вошла”<<ndigit[i]<<“ раз \n”;

cout<<“ пробельных символов - “<< nwhite <<“ прочих символов – ”

<< nother <<“\n”; }

При объявлении массива его можно инициализировать:

int c[ ] = { 1, 2, 7, 0, 3, 5, 5 };

char array[ ] = { ’h’, ’e’, ’l’, ’l’, ’o’, ’\n’, ’\0’};

Последнюю инициализацию разрешается выполнять проще:

char array[ ] = “hello\n”;

Такой синтаксис инициализации разрешен только для строк. Компилятор сам вычислит необходимый размер памяти с учетом автоматически добавляемого в конец строки символа ’\0’ с кодом 0, который является признаком завершения строки.

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

int mas[20];

int pmas;

pmas = &mas[0];

Последний оператор можно записать и так: pmas = mas;

Операция индексирования массива [ ] имеет 2 операнда - имя массива, т.е. указатель, и индекс, т.е. целое: a[i]. В языке С++ любое выражение указатель[индекс] по определению трактуется как

(указатель + индекс)

и автоматически преобразуется к такому виду компилятором.

Таким образом, a[3] эквивалентно (a + 3). Более того, это можно записать даже так 3[a], т.к. это все равно будет проинтерпретировано как (3+a). Здесь складываются указатель a и целое 3. В связи с этим рассмотрим так называемую адресную арифметику.

5.3. Адресная арифметика

Указатель можно складывать с целым.

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

Таким образом, pa+i - это адрес i-го элемента после pa, причем считается, что размер всех этих i элементов равен размеру объекта, на который указывает pa.

Итак, если a - массив, то

a+i - адрес i-го элемента этого массива, т.е.

&a[i] равен a+i и a[i] равняется (a+i).

float b[10];

float pb=b;

pb++; // Это эквивалентно pb=pb_1.

// Здесь указатель pb будет указывать

// на элемент массива b[1].

pb+=3; // Здесь pb указывает на элемент массива b[4].

Отметим, что нельзя написать b++ или b = b+i, т.к. имя массива b - это константный указатель и его изменять нельзя.

Указатели можно сравнивать.

Если p и q указывают на элементы одного и того же массива, то такие отношения, как < >= и т.д. работают надлежащим образом. Например,

p < q

истинно, т.е. = = 1, если p указывает на более ранний элемент массива, чем q. Любой указатель можно сравнить на равенство или неравенство с так называемым нулевым указателем NULL, который ни на что не указывает. Однако не рекомендуется сравнивать указатели, указывающие на различные массивы.

Указатели можно вычитать.

Если p и q указывают на элементы одного и того же массива, то p –  q дает количество элементов массива между p и q.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]