Механизм действия ссылочных типов - часть 2
типы, у которых механизм предоставления памяти совсем другой. Разберемся в нем.
2. Массивы. Рассмотрим второй фрагмент. Вот что находится в памяти после выполнения оператора A(2) = 5:
Адреса |
Значения |
Адреса |
Значения |
||
A |
000101 |
002040 |
![]() |
002040 |
0 |
002041 |
0 |
||||
002042 |
5 |
||||
B |
000102 |
002300 |
![]() |
002300 |
0 |
002301 |
0 |
||||
002302 |
0 |
На схеме я для наглядности изобразил ячейки в два столбца.
Пояснения: При выполнении операторов
Dim A(2) As Integer
Dim B(2) As Integer
каждой из переменных A и B отводится в памяти одна
ячейка и еще дополнительная область памяти для хранения элементов массива (по три ячейки, которые заполняются нулями). В этой одной ячейке находится адрес первой ячейки из области памяти или, по-другому, ссылка на эту область памяти. Ссылку еще называют указателем. Вот такой механизм. Таким образом, значением переменной A является совсем не набор из трех чисел, а всего лишь адрес, номер ячейки. Запомните это.
Когда выполняется оператор A(2) = 5, компьютер, зная, что массив является ссылочным типом, рассматривает значение 002040 в ячейке для переменной A именно, как адрес, а не число типа Integer, и поэтому не пытается записать в эту ячейку число 5, а отправляется по указанному адресу, где находит три ячейки. В какую из них записать число 5, ему указывает индекс 2.
Рассмотрим, как выполняется оператор B = A. Вам могло показаться по аналогии с первым фрагментом, что при этом все три числа из области памяти для A копируются в область памяти для B. Но нет, здесь по своему строгому, но привычному вам закону выполняется оператор присваивания. Закон этот говорит, что значение переменной A должно быть записано в ячейку для значения переменной B. Поскольку значением переменной A является адрес 002040, то он и копируется в ячейку для значения переменной B. Вот что получается:
Адреса |
Значения |
Адреса |
Значения |
||
A |
000101 |
002040 |
![]() ![]() |
002040 |
0 |
002041 |
0 |
||||
002042 |
5 |
||||
B |
000102 |
002040 |
002300 |
0 |
|
002301 |
0 |
||||
002302 |
0 |