Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Многомерные массивы




Массивы

Операции над указателями

Типизированные и нетипизированные указатели

Рассмотренные указатели являются типизированными, т.е. могут указывать только на заданный тип данных.

Существуют также нетипизированные указатели (void*), способные указывать на любой тип данных. Хранение размера и типа данного возложено на программиста.

Пример:

int x;

float y;

void *t = &x; //допустимо

*t = 5; // операция НЕДОПУСТИМА, т.к. неизвестен тип данного

*(int *)t = 5; //допустимо обращение при соответствующем приведении типов

t =& y;

*(double*)t = 2.5;

Для типизированных указателей определены операции сложения с числом и вычитания из них числа, при этом результатом является указатель того же типа, смещенный в памяти на заданное количество данных (т.е. на размер данного, умноженного на заданное смещение).

Также для типизированных указателей определена операция разности указателей. Данная операция возвращает количество элементов (размер_области_памяти/размер_элемента) между указателями.

Пример (будем считать, что sizeof(float) =4):

float *a=1000, *c;

short x;

c = a+10; // c = 1000+10*sizeof(float)=1040

c = c – 4; // c = 1040 – 4*sizeof(float) = 1024

x = c – a; // x = (1024-1000)/sizeof(float) = 6

Массивы являются набором однотипных данных, последовательно размещённых в памяти.

Одномерный массив можно объявить так:

тип_данного имя_массива[размер];

Например: int x[5];

Обращение к элементам массива происходит через операцию []. Минимальный индекс всегда ноль. Максимальный индекс – на единицу меньше размера массива.

ВНИМАНИЕ Автоматический контроль границ отсутствует.

Возможно создать массив требуемого размера во время выполнения программы. Например, в библиотеке mem.h определены функции malloc для выделения памяти и free для её освобождения.

Пример:

int *x;

x = (int*)malloc(10*sizeof(int)); // выделение памяти для 10 элементов типа «int»

… // некоторый код по работе с массивом

free(x); // освобождение памяти

Более подробно данные функции будут рассмотрены ниже.

В «С++» для выделения памяти под массив элементов определены операции new[] и delete[].

Пример (аналогичный по функциональности предыдущему):

int *x;

x = new int[10];

delete []x;

Возможны по крайней мере три варианта реализации многомерных массивов.

1. Использование специальных типов данных. В этом случае размер по каждому измерению указывается в отдельных квадратных скобках. Обращение к элементам происходит аналогично одномерному массиву.

Пример:

int x[4][4][3];

x[0][0][0] = 5;

Массивы могут инициализироваться значениями в фигурных скобках, при этом допустимо не указывать последнюю (самую левую) размерность. Если заданная размерность меньше инициализирующих аргументов, часть элементов останется неопределенна. Обратная ситуация вызовет ошибку.

Примеры:

int x[3][2]={{1,2},{3,4},{5,6}}; //заданы и размеры массива, и инициализирующие значения

long y[] = {1,2,3,4}; // размер массива определяется фактическому по количеству // значений (4)

char t[][4] = {{1,2,3,4},{5,6}}; // последняя размерность определяется по числу значений (2) и // элементы t[1][2] и t[1][3] не определены

При таком указании данные располагаются в памяти последовательно, порядок расположения соответствует порядку указания при инициализации.

2. Использование многомерных указателей. В этом случае каждую размерность указателя требуется явно инициализировать. Таким способом можно получить, например, двумерный массив с различной длиной строк.

Пример:

int **x;

x = new int*[3];

for(int i=0;i<3;i++) x[i] = new int[i];

x[0][0] = 0; x[1][0] = 1; x[1][1] = 2; x[2][0] = 3; x[2][1]=4; x[2][2] = 5;

Получаем массив вида

В этом случае в памяти отдельно хранится массив указателей на строки и отдельно сами строки.

3. Хранение многомерного массива в одномерном.

Например, переход от двух индексов (i,j) можно осуществить по формуле i*m+j, где m – максимальная размерность по j (количество столбцов).




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


Дата добавления: 2014-01-05; Просмотров: 278; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.