Как элементы массива хранятся, когда массив имеет нулевые элементы? - PullRequest
2 голосов
/ 18 февраля 2020

Я знаю, что это основа c, но я не нахожу источников, подтверждающих мою интерпретацию.

Цель состоит в том, чтобы понять, как массивы хранятся в памяти, ниже вы найдете мою интерпретацию.

Если массив 4 размера имеет вид:

array[0] = 0

array[1] = null

array[2] = 2

array[3] = 3

Хранится ли он рядом в памяти без подсчета нулей, например, как это?

[0], [2], [3]

если вы добавляете элемент в нулевую позицию ([1]), чем следующие элементы вытягиваются на 1 позицию в памяти?

[0], [ 1] (новый) , [2] (вытянутый) , [3] (вытянутый)

Ссылки (среди других) ):

Ответы [ 2 ]

4 голосов
/ 18 февраля 2020

Если вы начнете с пустого массива, например, так:

int[] intArray = new int[];
String[] stringArray = new String[];

у вас будет это в вашей памяти java (это упрощено): enter image description here

Оба массива инициализируются с их значениями по умолчанию (ноль для String, потому что это объект, и 0 для int).

Что такое инициализация по умолчанию для массива в Java?

Теперь, если вы попытаетесь заполнить массивы:

intArray[0] = 0
intArray[2] = 2
intArray[3] = 3

stringArray[0] = "0"
stringArray[2] = "2"
stringArray[3] = "3"

вы получите в памяти следующее:

enter image description here

если вы добавляете элемент в нулевую позицию ( 1 ), чем следующие элементы вытягиваются на 1 позицию в памяти?

Нет этого неверно, если значение index (1) равно нулю, оно все равно будет занимать свое место в индексе (см. последнее изображение, см. 2 ). Поскольку индекс (1) фактически заполнен значением, только это значение по умолчанию.

4 голосов
/ 18 февраля 2020

A null обычно представляется в памяти всеми битами, равными нулю. Это верно независимо от того, хранится ли null в массиве или где-либо еще.


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

Выше вы получите любой учебник, но имейте в виду, что некоторые языки, такие как Javascript и PHP, используют слово «массив» для обозначения вещей, которые являются , а не массивами. Javascript «массив» - это действительно список , а PHP «массив» - это действительно странный гибрид между списком и ассоциативным массивом . Python list не является массивом, хотя некоторые источники ошибочно называют его одним. Все эти другие структуры данных позволяют вставлять элемент в индекс, но «вставить элемент» не является операцией над массивом, поскольку для этого потребуется увеличить длину массива на 1. Единственное Операции над массивами заключаются в том, чтобы получить значение по индексу, установить значение по индексу и (если это массив с префиксом длины) получить длину массива. Вы можете использовать массив для представления последовательности переменной длины, но вы не должны путать массив с тем, что он представляет.

Не существует специальной обработки null в отношении места памяти; если массив имеет null в индексе 1, то область памяти, соответствующая индексу 1, содержит представление памяти null. Весь смысл массива состоит в том, что каждый индекс соответствует определенному месту в памяти, поэтому вы можете использовать этот индекс для непосредственного определения места в памяти. Формула для адреса памяти элемента массива:

(адрес для array[index]) = (адрес array start) + index * (байт на элемент массива)

Если элемент с индексом 1 не занимает ячейку памяти, то элемент с индексом 2 не будет в нужном месте в соответствии с этой формулой.


Естественный последующий вопрос: если null в массиве представлен в памяти так же, как число 0, как программа может определить, является ли значение null или 0?

Поскольку все элементы массива должны быть одного и того же типа, null в массиве имеет смысл, только если элементы массива являются ссылками , а не примитивными целыми числами. Например, в Java вы можете иметь null в массиве Integer[], но не массив int[]. Таким образом, нулевые биты, представляющие null, не следует путать с нулевыми битами, представляющими число 0, поскольку любой, читающий массив ссылок, должен интерпретировать содержимое как ссылки, а не как целые числа; и любой, кто читает массив примитивных целых чисел, должен интерпретировать эти биты как число 0, а не как ссылку null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...