Метод Айлиффа
Метод Айлиффа доступа к элементам массива пригоден для работы, как с прямоугольными, так и непрямоугольными массивами. В некоторых случаях он может оказаться более быстродействующим, так как не использует операций умножения, однако метод требует дополнительной памяти. В качестве примера рассмотрим представление двумерного массива, в котором длина i-й строки равна i+1, как это представлено на рис 4. Выделение памяти для такого массива выглядит следующим образом:
// выделим память для массива из 4-х указателей на строки
double **a=new double *[4];
// выделим память для каждой строки
for(int i=0; i<4; i++){
a[i]=new double[i+1];
}
Теперь имеем право обращаться к элементам массива как обычно: a[i][j]
Заметим, что запись a[i][j] эквивалентна записи *(*(a+i)+j), что в действительности и происходит при обращении к элементу массива a[i][j]:
- в переменной анаходится адрес начала массива указателей на строки.
- прибавив к нему i, получим адрес a+i указателя на i-ю строку
- извлечем из него адрес начала i-й строки: *(a+i)
- прибавим к нему j и получим адрес j-го элемента i-й строки: *(a+i)+j
- и, наконец, извлекаем по этому адресу значение элемента массива: *(*(a+i)+j)
Как видно, операция умножения действительно не используется. Поскольку память для массива была взята из кучи, то впоследствии ее необходимо освободить. Освобождение выполняется в порядке обратном выделению:
for(int i=0; i<4; i++){
delete [] a[i];
}
Дата добавления: 2014-12-02; просмотров: 847;