Определение размера памяти двумерных массивов
Обращение к элементам двумерного массива
Обращение к элементам двумерного массива осуществляется так же, как и к элементам одномерного.
ИмяМассива[ВыражениеТипаКонстанты][ВыражениеТипаКонстанты];
или
ИмяМассива[ЗначениеИндекса][ЗначениеИндекса];
Например:
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 размерности M×N, расположенным в памяти по строкам, то адрес элемента B[i][j] вычисляется по формуле:
адрес(B[i][j]) = адрес(B[0][0]) + (i*N+j)*k
Так как массивы занимают непрерывный участок памяти, то двумерный массив размерности M×N можно рассматривать как одномерный массив из 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 3
int _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 << " байт ";
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 << " байт ";
double d_mas[2*q-r][2*v/p];
int w=sizeof(d_mas);
cout << "d_mas[2*q-r][2*v/p] занимает " << w << " байт ";
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 << " байт ";
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 (заданное количество элементов массива)