logo
Posobie_Cpp

Int tacs[3];

tacs[0] = 43; // присваиваем значение нулевому элементу

*tacs = 2; // или так присваиваем новое значение нулевому элементу

*(tacs + 1) = 4; // присваиваем значение первому элементу

По видимому, нет необходимости обращаться к i-му элементу массива, используя выражение *(tacs + i) , а не tasc[i]. Однако знать о такой возможности следует.

Такой же принцип доступа к элементам массива сохраняется и для многомерных массивов. Так, доступ к элементу двумерного массива можно получить обычным способом: mass[i][j], а можно так: *(mass[i] + j) или *(* (mass +i)+j).

С указателями можно выполнять следующие операции: разыменования (*), присваивания, сложение с константой, вычитание указателей, инкремента (++), декремента (--), приведения типов.

Из приведенного выше примера можно понять, что операция инкремента перемещает указатель к следующему элементу массива, а декремента – к предыдущему. Само значение указателя изменяется на величину, соответствующего типа, выраженного в байтах. Например,

int *pint = new int [3]; // выделена память под массив из трех элементов

p++; // значение увеличивается на 4

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

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

*pint++ = 12;

следует понимать так

*pint = 12; pint++; // по адресу связанному с pint пишется значение 12

// затем значение pint увеличивается

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

(*pint)++; // значение по адресу pint увеличивается на единицу &&&&

Следующий фрагмент кода копирует элементы массива в другой массив1. Из возможных способов выбран тот, который иллюстрирует особенности арифметики указателей:

int a [100], b[100];

int *pa = a; // или int *pa = &a[0];

int *pb = b;

for (int i=0;i<100; i++)

*pb++ = *pa++; // или b[i]=a[i];

Контрольные вопросы и задания.

1. Почему в приведенной ниже программе значение элемента массива p[2] становится неопределнным? Почему p[0] становится равным 2?

#include <iostream.h>