248.72K
Категория: ПрограммированиеПрограммирование

Статические массивы. Связь массивов и указателей

1.

Информатика
Статические массивы. Связь
массивов и указателей.

2.

Статические массивы
Массив – конечная именованная последовательность
однотипных величин. Элементы массива в памяти
расположены линейно и непрерывно.
Статический (встроенный) массив – массив, число
элементов которого определено на этапе компиляции.
При этом память под элементы отводится в стэке
(для локальных переменных) или в статической (для
глобальных переменных) памяти.
2

3.

Статические массивы
Напоминание:
Статические массивы, как и любая другая
локальная переменная, уничтожаются при выходе
из блока кода, где они объявлены.
3

4.

Объявление массива
Объявление:
type arr_name[N];
type – тип элементов массива;
N – число элементов (неотрицательное целое
число). На этапе компиляции N должно быть
определено.
4

5.

Объявление массива
Массивы могут быть многомерными:
type arr_name[N][M]…[K];
При этом значения всех размерностей должны
быть определены на этапе компиляции.
5

6.

Инициализация массива
Инициализация массива может быть проведена
следующим образом:
type arr[N] = {a0, a1, …, aM};
где M ≤ N – 1.
Если M < N, то оставшиеся элементы
инициализируются нулевыми значениями
(значениями по умолчанию для типа type).
6

7.

Инициализация массива
int arr1[5] = {1, 2, 3, 4, 5};
1 2 3 4 5
int arr2[5] = {1, 2};
1 2 0 0 0
int arr3[5] = {0};
0 0 0 0 0
7

8.

Инициализация массива
Многомерные массивы могут быть инициализированы с
указанием подмассивов. При этом элементы, входящие в
определенный подмассив группируются посредством
фигурных скобок:
type arr1[N][M]={
{a00, a01, a02},
{a10, a11, a12, a13}
};
Инициализация начинает с младшей размерности. При
этом оставшиеся элементы будут также инициализированы
нулевыми значениями (значениями по умолчанию для типа8
type).

9.

Инициализация массива
Многомерный массив также может быть
инициализирован аналогично одномерному. При
этом элементы массива инициализируются
последовательно.
type arr1[N][M] = {a0, a1, a2, a3, a4, a5};
Массив имеет размерность N строк и M столбцов.
9

10.

Статические массивы
int arr1[3][2] = { {1}, {2, 3}, {4, 5} };
1 0
2 3
4 5
int arr2[3][2] = { 1, 2, 3, 4, 5 };
1 2
3 4
5 0
10

11.

Статические массивы
Обратиться к элементам массива можно посредством
индексов:
type arr[N];
type val = arr[5];
arr[0] = val;
type arr2D[M][N];
type val = arr2D[0][3];
arr2D[3][1] = val;
Нумерация элементов массива начинается с нуля.
Выход за границы массива не проверяется.
11

12.

Связь массива и указателя
Элементы статических массивов, в том числе
многомерных, располагаются в памяти последовательно
и непрерывно.
Имя одномерного массива компилятор интерпретирует
как указатель на первый элемент (т.е. с индексом 0).
Имя двумерного массива интерпретируется как
указатель на нулевую строку (одномерный подмассив),
имя трехмерного – как указатель на нулевой двумерный
подмассив и т.д.
12

13.

Связь массива и указателя
type arr[N];
Адрес i-го элемента может быть вычислен по
формуле:
address = arr + i*sizeof(type);
13

14.

Связь массива и указателя
Если говорить словами, то:
индекс элемента массива – смещение
относительно начала массива, кратное размеру
типа.
14

15.

Связь массива и указателя
Следовательно, к элементам массива можно
обращаться посредством указателя:
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;
for(int i = 0; i < 5; i++){
std::cout << *ptr << “ ”;
ptr++;
}
1, 2, 3, 4, 5
15

16.

Связь массива и указателя
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;
*(ptr+2) = 7;
ptr[2] = 7
arr = {1, 2, 7, 4, 5}
16

17.

Связь массива и указателя
С указателем может также использоваться
оператор [].
type* ptr = &arr[0]; // &arr[0] = arr
ptr[N] = val;
При этом происходит доступ к элементу,
смещенному на N*sizeof(type) байт относительно
адреса, на который указывает ptr.
17

18.

Связь массива и указателя
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;
ptr[2] = 7;
arr[2] = 7
arr = {1, 2, 7, 4, 5}
18

19.

Расположение элементов в памяти
Элементы статических массивов, в том числе
многомерных, располагаются в памяти
последовательно и непрерывно.
19

20.

Расположение элементов в памяти
int arr3D[4][3][2] = {{
{
{
{
{ 1, 2 },
{ 3, 4 },
{ 5, 6 }
{ 7, 8 },
{ 9, 10 },
{ 11, 12 }
{ 13, 14 },
{ 15, 16 },
{ 17, 18 }
{ 19, 20 },
{ 21, 22 },
{ 23, 24 } }
},
},
},
};
20

21.

Расположение элементов в памяти
Нулевой двумерный
подмассив [3][2]
XXX
1
2
3
4
5
6
7

21
22
23
24
XXX
Нулевой одномерный
подмассив размерностью 2
21

22.

Расположение элементов в памяти
Поскольку элементы массивов, в том числе и
многомерных, располагаются в памяти
последовательно, то любой многомерный
статический массив может быть интерпретирован
как одномерный массив с размерностью, равной
произведению размерностей соответствующего
многомерного массива.
22

23.

Расположение элементов в памяти
int arr3D[4][3][2] = {{
{
{
{
{ 1, 2 },
{ 3, 4 },
{ 5, 6 }
{ 7, 8 },
{ 9, 10 },
{ 11, 12 }
{ 13, 14 },
{ 15, 16 },
{ 17, 18 }
{ 19, 20 },
{ 21, 22 },
{ 23, 24 } }
},
},
},
};
23

24.

Расположение элементов в памяти
int* ptr = &arr3D[0][0][0]; //
адрес первого
элемента
for(int i = 0; i < 4*3*2; i++){
std::cout << *ptr << “ ”;
ptr++;
}
1 2 3 4 5 6 7 8 9 10 11 … 21 22 23 24
24

25.

Расположение элементов в памяти
Для вычисления адреса элемента трехмерного
массива с индексами i, j и k используется
следующая формула:
type arr[N][M][L];
address = &arr[0][0][0] +
i*M*L*sizeof(type) + j*L*sizeof(type) +
k*sizeof(type);
25

26.

Расположение элементов в памяти
Если доопределить MN как 1, то для N-мерного
массива формула для N > 1 имеет вид:
type arr[M0][M1]…[MN-1];
&arr[k0][k1]…[kN-1] = &arr[0]…[0] +
English     Русский Правила