Основы программирования на C++, PASCAL
Пусть, например, в программе объявлен массив:
int Х[10];
В таком случае Х является указателем на нулевой элемент массива в памяти компьютера. В связи с этим истинным является отношение
Х==&Х[0]
Отсюда следует, что для доступа к элементам массива кроме индексированных имен можно использовать разадресованные указатели по принципу:
имя [индекс] тождественно * (имя + индекс)
Например, для описанного выше массива х взаимозаменяемы следующие обозначения элементов:
Х[5], или *(Х+5), или *(5+Х).
Напоминаем, что для указателей работают свои правила сложения. Поскольку Х — указатель на величину целого типа, то Х+5 увеличивает значение адреса на 10.
В языке Си символ [ играет роль знака операции сложения адреса массива с индексом элемента массива.
Из сказанного должно быть понятно, почему индекс первого элемента массива всегда нуль. Его адрес должен совпадать с адресом массива:
Х[0]==*(Х+0)
Поскольку имя массива является указателем-константой, то его нельзя изменять в программе, т. е. ему нельзя ничего присваивать. Например, если описаны два одинаковых по структуре массива
int X[10],Y[10];
то оператор присваивания X=Y будет ошибочным. Такое возможно в Паскале, но недопустимо в Си. Пересылать значения одного массива в другой можно только поэлементно.
Теперь рассмотрим двумерные массивы. Пусть в программе присутствует описание:
int Р[5][10];
Это матрица из пяти строк и десяти чисел в каждой строке. Двумерный массив расположен в памяти в последовательности по строкам. По-прежнему Р является указателем-константой на массив, т. е. на элемент Р[0][0]. Индексированное имя Р[i] обозначает i-ю строку. Ему тождественно следующее обозначение в форме разадресованного указателя:
*(P+i*10)
Обращение к элементу массива Р[2][4] можно заменить на *(Р+2*10+4). В общем случае эквивалентны обозначения:
P[i] [j] и *(P+i*10+j)
Здесь дважды работает операция «квадратная скобка». Последнее выражение можно записать иначе, без явного указания на длину строки матрицы Р:
*(*(P+i)+j).
Очевидно, что по индукции для ссылки на элемент трехмерного массива A[i][j][k] справедливо выражение
* (* (* (A+i)+j)+k) и т.д.
Массив как параметр функции. Обсудим эту тему на примерах.
Пример 1. Составим программу решения следующей задачи. Дана вещественная матрица А[М][N]. Требуется вычислить и вывести евклидовы нормы строк этой матрицы.