![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
К элементам двухмерных массивов
Рассмотрим объявление и связь указателей и элементов двухмерных массивов. Двухмерный массив в языке С++ рассматривается как совокупность одномерных массивов (его строк), а строка – совокупность элементов одномерного массива. Объявление двухмерного массива с явным указанием количества элементов массива: < тип_элементов_массива> < имя_массива> [< кол–во_строк> ][< кол–во_столбцов> ]; Для обращения к элементам двухмерного массива используется два индекса (индексных выражений): < имя_массива> [< выражение1> ][< выражение2> ]; Индексные выражения вычисляются слева направо, полученные значения применяется после вычисления последнего индексного выражения. Элементы массивов располагаются в ОП таким образом, что быстрее изменяются самые правые индексы, т.е. элементы одномерного массива располагаются подряд, а двухмерного – по строкам. Пример объявления двухмерного массива значений типа: int a[m][n]; Этот массив состоит из m одномерных массивов (строк), каждый из которых содержит n элементов (столбцов). При работе с этим двухмерным массивом можно использовать одно или два индекса (индексных выражения), например, а[i][j] содержит 2 индекса. Такая запись используется для обращения к элементу, расположенному на пересечении i-й строки и j-го столбца массива. Для получения значения этого элемента вначале вычисляются индексные выражения, затем определяется адрес элемента массива в ОП и извлекается его значение. a[i] содержит один индекс: подобная запись определяет адрес одномерного массива, т.е адрес начала i-й строки массива. Имя массива а не содержит индекса и определяет адрес массива, т.е. адрес его нулевого элемента. Таким образом, обращение к двухмерным массивам с помощью имени и только одного индекса определяет указатель на начало соответствующей строки массива (адрес ее нулевого элемента). Напомним, что в одномерном массиве адрес i-го элемента массива & a[i] формируется в виде а + i*sizeof(int). Используя это, определим соотношения: a[0] a[1] a[i] Обращение к элементам многомерного массива более детально рассмотрим на примере двухмерного массива: int a[3][4]; //а – указатель-константа int *р=& а[0][0]; // р – указатель-переменная После этого указатель р можно использовать вместо указателя а для обращения к строкам или элементам массива. В ОП элементы массива а располагаются таким образом, что быстрее всех изменяется самый правый индекс, т.е. в последовательности: a[0][0] а[0][1] а[0][2] а[0][3] а[1][0]... а[2][0] а[2][1] а[2][2] а[2][3] При этом для обращения к массиву а можно использовать имена: & а *(& а[0][0]) a[i] *a[i] a[i][j] где (а+i) (*(a+i)+j) – адрес j-го элемента i-й строки, т.е. & a[i][j]; *(*(a+i)+j) – значение j-го элемента i-й строки, т.е. a[i][j]. Значение адреса начала i-й строки (адреса 0-го элемента i-й строки) на машинном уровне формируется в виде: a[i] где n — количество элементов в одной строке. Таким образом, адрес (i+1)-й строки смещен относительно i-й строки на (n*sizeof(int)) байт, т.е. на одну строку массива. Выражение a[i][j] компилятор С++ переводит в эквивалентное выражение *(*(а+i)+j). К элементам двухмерного массива можно обратиться и с помощью скалярного указателя на массив. Например, после объявления: int a[m][n], *р = & а[0][0]; где n – количество элементов в строке; i*n+j – смещение элемента a[i][j] относительно начала массива а.
Пример 1. Дан одномерный динамический массив. Вычислить среднее арифметическое модулей элементов массива.
Ход выполнения работы 1. Алгоритмы решения задач с использованием динамических массивов схожи с алгоритмами, использующими статические массивы. 2. Написать программу, соответствующую алгоритму:
Для ввода элементов массива как обычно использовалась функция scanf(). Вторым аргументов этой функции является адрес переменной, которая получает вводимое значение. В данном примере это адрес i-го элемента динамического массива a+i. При вычислении суммы значение i-го элемента получали с помощью записи
Вывод элементов массива осуществляется при помощи функции printf(), где для вывода элементов применялась та же форма записи. 3. Создать проект и реализовать данную задачу в среде Visual C++ 6.0. Пример 2. Сформировать двухмерный динамический массив по закону
Ход выполнения работы 1. Алгоритмы решения задач с использованием динамических массивов схожи с алгоритмами, использующими статические массивы. 2. Написать программу, соответствующую алгоритму:
3. Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
Пример 3. Дан двухмерный динамический массив размера
Ход выполнения работы 1. Решение этой задачи было подробно рассмотрено в разделе «Двухмерные массивы». 2. Написать программу, соответствующую алгоритму:
3. Создать проект и реализовать данную задачу в среде Visual C++ 6.0.
|