Пример 1 . Определение размера памяти двумерного массива
Лабораторная работа № 13
Двумерные массивы: задачи поиска, замены и суммирования элементов двумерного массива. Двумерные массивы: задачи сортировок и перестановок в двумерных массивах.
Двумерные массивы, являющиеся упорядоченными однотипными объектами, можно отождествлять с прямоугольной матрицей.
Двумерные массивы состоят из строк и столбцов.
Объявление двумерных массивов
Синтаксис определения массива без дополнительных спецификаторов и модификаторов имеет два формата:
Тип ИмяМассива[ВыражениеТипаКонстанты][ВыражениеТипаКонстанты];или
Тип ИмяМассива[][];ИмяМассива – идентификатор массива.
Тип – тип элементов объявляемого массива. Элементами массива не могут быть функции, файлы и элементы типа void.
ВыражениеТипаКонстанты – задает количество элементов (размерность) массива. Выражение константного типа вычисляется на этапе компиляции. Данное константное выражение может быть опущено в случаях если:
· при объявлении массив инициализируется;
· массив объявлен как формальный параметр функции;
· массив объявлен как ссылка на массив, явно определенный в другом файле.
Например:
1. int a[100][50];//массив из 100x50 элементов целого типа
2. double d[4][10];// массив из 4x10 элементов типа double
3. int t=5, k=8;4. float wer[2*t+k][2*t+k]; 5. //массив из (2*t+k)x(2*t+k) элементов вещественного типа6. int sample[853][157]; 7. //массив из 853 строк и 157 столбцов, элементы типа intравносильно объявлению
|
|
равносильно объявлению
#define N_max 853#define M_max 157...int sample[N_max][M_max];Двумерные массивы располагаются в памяти в порядке быстрого изменения последнего индекса. Так, например, данные двумерного массива (состоящего из 3 строк и 10 столбцов и определенного как float A[3][10]; ), располагаются следующим образом:
Строки | Столбцы | |
1 | 2...9 | |
1 | A[0][0] | A[0][1] ... A[0][9] |
2 | A[1][0] | A[1][1] ... A[1][9] |
3 | A[2][0] | A[2][1] ... A[2][9] |
Инициализация двумерных массивов
Двумерные массивы инициализируются так же, как и одномерные.
Например:
int w[3][3]={ //инициализируется целочисленный массив размерностью 3x3 {2, 3, 4}, //1-я строка {3, 4, 8}, //2-я строка {1, 0, 9} //3-я строка }; float w[2][3]={ //инициализируется вещественный массив размерностью 2x3 {2.1, 3.4, 4.5}, //1-я строка {5.0, 6.4, 3.9} //2-я строка };равносильно инициализации
float w[][3]={ {2.1, 3.4, 4.5}, //1-я строка {5.0, 6.4, 3.9} //2-я строка };Последовательности, выделенные в фигурные скобки, соответствуют строкам массива, в случае отсутствия скобок инициализациябудет выполнена неправильно.
int w[3][5]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 |
11 |
1 | 2 | 3 | ||
4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 |
Обращение к элементам двумерного массива
|
|
Обращение к элементам двумерного массива осуществляется так же, как и к элементам одномерного.
ИмяМассива[ВыражениеТипаКонстанты][ВыражениеТипаКонстанты];или
ИмяМассива[ЗначениеИндекса][ЗначениеИндекса];Например:
a[0][0] – индекс задается как константа,
d[55][5] – индекс задается как константа,
s[i][j] – индекс задается как переменная,
w[4*p][3+t] – индекс задается как выражение.
Определение размера памяти двумерных массивов
В языке С++ определены только одномерные массивы, но поскольку элементом массива может быть массив, возможно определить и двумерные массивы. Они определяются списком константных-выражений следующих за идентификатором массива, причем каждое константное-выражение заключается в свои квадратные скобки. Каждое константное-выражение в квадратных скобках определяет число элементов по данному измерению массива, так что объявление двумерного массива содержит два константных-выражения, трехмерного – три и т.д.
спецификатор-типа имя_массива [конст_выражение1] [конст_выражение2];Например,
|
|
Объем занимаемой памяти в байтах для двухмерного массива вычисляется по формуле:
Байты = sizeof (тип) * конст_выражение1* конст_выражение2Если мы имеем дело с двумерным массивом B размерности MxN, расположенным в памяти по строкам, то адрес элемента B[i][j] вычисляется по формуле:
адрес(B[i][j]) = адрес(B[0][0]) + (i*N+j)*kТак как массивы занимают непрерывный участок памяти, то двумерный массив размерности MxN можно рассматривать как одномерный массив из M указателей, которые являются константами. Константы-указатели содержат значения адресов Mодномерных безымянных массивов. Поэтому обращение к элементу B[i][j] посредством B[i*N + j] невозможно, так как указателя с номером i*N + j может не существовать.
Пример 1 . Определение размера памяти двумерного массива
#include "stdafx.h"#include <iostream>using namespace std;#define v 4#define p 3int _tmain(int argc, _TCHAR* argv[]){ const int q=4, r=1; int i_mas[10][10]; int k=sizeof(i_mas); cout << "i_mas[10][10] занимает " << k << " байт\n"; float f_mas[3][5]={{2.0},{4.5,8.3},{7.0,1.0,5.5,7.8}}; int t=sizeof(f_mas); cout << "f_mas[3][5]={{2.0},{4.5,8.3},{7.0,1.0,5.5,7.8}} занимает " << t << " байт\n"; double d_mas[2*q-r][2*v/p]; int w=sizeof(d_mas); cout << "d_mas[2*q-r][2*v/p] занимает " << w << " байт\n"; int r_mas[][3]={{2,5,7},{-4,8,-3},{0,-1,1}}; int g=sizeof(r_mas); cout << "r_mas[][3]={{2,5,7},{-4,8,-3},{0,-1,1}} занимает " << g << " байт\n"; system("pause"); return 0;}Результат выполнения программы:
|
|
i_mas[10][10] занимает 400 байт – 4 байта (тип int ) * 10*10 (количество элементов массива)
f_mas[3][5]={{2.0},{4.5,8.3},{7.0,1.0,5.5,7.8}} занимает 60 байт – 4 байта (тип float ) * 3*5 (объявленное количество элементов массива)
d_mas[2*q-r] [2*v/p] занимает 112 байт – 8 байт (тип double ) * 7*2 (вычисленное через формулу количество элементов массива)
r_mas[][3]={{2,5,7},{-4,8,-3},{0,-1,1}} занимает 36 байт – 4 байта (тип int ) * 3*3 (заданное количество элементов массива)
Дата добавления: 2021-07-19; просмотров: 65; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!