Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Для решения одних и тех же задач можно использовать многомерные массивы и массивы указателей. Для простоты сравнения возьмем двумерный массив и одномерный массив указателей. Пусть имеем следующие определения:
short a[10][10];
short *b[10];
и пусть оба массива используются аналогичным образом, т.е. a[5][5] и b[5][5] допустимые обращения к одному и тому же целому значению. Тогда под массив a будет выделена память размером в 100 целых значений (200 байтов), а под массив b – размером в 10 указателей типа short. Если каждая ссылка массива b указывает на массив из 10 целых, то потребная память для решения составит: 100 целых + 10 указателей на short. Кроме того, необходимо будет динамически выделять память под массив. Однако, не требуется вычислять адрес элемента двумерного массива, а можно обратиться прямо по ссылке.
Второе преимущество: каждый элемент массива ссылок может указывать на на массив, количество элементов которого может быть произвольным, т.е. с его помощью можно реализовать так называемые непрямоугольные массивы, содержащие разное число элементов в младших измерениях. Обычно это используют при работе с массивами строк (string). См. пример "Инициализация массива ссылок".
Пример. Вывод сообщений в окна.
#include <conio.h>
#define Screen BLACK
void message(short nom, // Номер сообщения
short reg){ // Режим: 1-вывод сообщения, 0-очистить окно
static struct mes{ // Описание сообщения
short beg_x, // Начальная позиция окна по x
beg_y, // Начальная позиция окна по y
end_x, // Конечная позиция окна по x
end_y, // Конечная позиция окна по y
regim; // Режим вывода текста: 'r' – с разрядкой, 'p' - плотный
char *text; // Текст сообщения
} def[ ]={ // Инициализация списка сообщений
28, 2, 54, 4, 'r', "ВВОД ДАННЫХ",
19, 12, 61, 14, 'p', "Имя файла входных данных",
.
.
.
19, 12, 61, 14, 'r', "ВВОД ДАННЫХ ЗАКОНЧЕН"
};
struct mes *p; // Указатель на элемент списка
p = &def[nom-1];
if (reg){ // Вывод сообщения в окно
init_window(p->beg_x, p->beg_y, p->end_x, p->end_y,
BLACK, LIGHTGRAY, 1);
out_text(2, 2, 200, p->regim, p->text);
} else { /* Очистка окна */
clear_window(p->beg_x, p->beg_y, p->end_x, p->end_y, Screen);
}
} /* End message */
Дата публикования: 2014-11-02; Прочитано: 204 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!