Лексические основы языка C ++. Алфавит и лексемы языка C++. Операторы C++. Массивы и указатели, страница 8

            Из указателя можно вычитать целочисленное значение, тогда числовое значение указателя уменьшится на величину k*sizeof(type), где k – вычитаемое, type - тип объекта, к которому относится указатель

3. Сложение указателя с целочисленными значением

.

void main()

{

 float z=0.0, pi=3.14, euler=2.718;

 float* ptr=& euler;

 printf ("%f",*ptr):      //2.718

 printf ("%f",*(ptr+1));  //3.14

 printf ("%f",*(ptr+2)); //0.0

Cложение двух указателей запрещено (т.к. возможен выход за границу сегмента)

4. Операции автоинкремента, автодекремента.

Числовое значение указателя уменьшается или увеличивается на sizeof (type). При этом указатель перемещается к соседнему объекту с меньшим или большим адресом.

5. Установка указателя на указатель

void main ()

{

 int i=50;

 int* pi=&i;

 int** ppi=π

 cout<<"\n **ppi; //50

}

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

Определение одномерного массива с элементами типа type:

type имя_массива [константное_выражение]

При описании внешнего массива количество элементов не указывается:

extern long L [];

Доступ:

имя_массива [индекс] //индекс начинается с 0

При определении статического массива может выполняться его инициализация.

1) если размерность массива задана явно, то количество элементов в списке инициализации может быть меньше или равно размерности массива

int I [6] = {10,20,30,40}

Те элементы, для которых значения в списке инициализации не указываются, равны 0.

2) без указания размерности массива

double D[]={1.,2.,3.,4.}

Размерность массива определяется по количеству элементов в списке инициализации

int m []={10,20,30,40};

for (int i=0; i<sizeof(m)/sizeof(m[0]); i++) cout<< m[i];     

При определении массива для его элементов выделяется память. После того как память выделена, имя массива воспринимается как константный указатель на элементы того типа, который был задан для элементов массива. Имя массива трактуется не как указатель, если надо определить размерность массива

размер массива = sizeof(m)

или если надо определить адрес массива, вэтом случае определяется адрес нулевого элемента массива.

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

Для любого массива соблюдается соотношение

имя_массива == & имя_массива == & имя_массива [0]

&m = =m;           // имя массива является константой-указателем на элемент с нулевым индексом

Так как имя массива является указателем, к нему применимы операции адресной арифметики. Операция обращения к элементу массива по индексу является бинарной.

Действие бинарной операции индексирования  с использованием операции раскрытия ссылки может быть представлено так:

*(имя массива + индекс)

*m – обращение к первому элементу массива с нулевым индексом

*(m+1) , ко второму элементу массива

Обращение к элементу массива –это постфиксное выражение вида UK[I]. UK – указатель на массив, UK[I] – индексируемый элемент. *(UK+I) – другой путь доступа к элементу этого же массива. Сложение коммутативно, т.е. *(I+UK) – эквивалентная форма записи, следовательно, I[UK] именует тот же элемент, что UK[I].

На массив можно установить указатель следующим способом:

type* имя_указателя=имя_уже_определенного_массива;

type* имя_указателя=new type [размер_массива];

type* имя_указателя=(type*) malloc (размер_массива*sizeof(type));

long arlong []={100,200,300,400};

long* arlo=arlong;

sizeof(arlong) // 16 байт – размер массива

sizeof(arlo)  // 4 байта – размер указателя на массив

void main()

{

 int array[10];

 int* p=array; int i;

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

 for (i=0; i<10; i++) printf ("%d\n”,*p++);

     Освобождение памяти, занятой массивом,