Пример 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

равносильно объявлению

const int N_max=853, int M_max=157;int sample[N_max][M_max];

равносильно объявлению

#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        
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    

Обращение к элементам двумерного массива

Обращение к элементам двумерного массива осуществляется так же, как и к элементам одномерного.

ИмяМассива[ВыражениеТипаКонстанты][ВыражениеТипаКонстанты];

или

ИмяМассива[ЗначениеИндекса][ЗначениеИндекса];

Например:

a[0][0] – индекс задается как константа,

d[55][5] – индекс задается как константа,

s[i][j] – индекс задается как переменная,

w[4*p][3+t] – индекс задается как выражение.

Определение размера памяти двумерных массивов

В языке С++ определены только одномерные массивы, но поскольку элементом массива может быть массив, возможно определить и двумерные массивы. Они определяются списком константных-выражений следующих за идентификатором массива, причем каждое константное-выражение заключается в свои квадратные скобки. Каждое константное-выражение в квадратных скобках определяет число элементов по данному измерению массива, так что объявление двумерного массива содержит два константных-выражения, трехмерного – три и т.д.

спецификатор-типа имя_массива [конст_выражение1] [конст_выражение2];

Например,

int a[2][3]; /* представлено в виде матрицы          a[0][0] a[0][1] a[0][2]          a[1][0] a[1][1] a[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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!