Как массивы работают внутри c/С++
Мне было интересно, как массивы работают в c. Я получаю гипотезу, и я хотел бы знать, прав я или нет.
Мы знаем, что массивы представляют собой последовательность соседних ячеек памяти (ящиков), где каждый ящик имеет размер того типа, который он запасает (т.е. если INTs one box имеет размер = sizeof (int), а массив из 3 INTs принимает память соседних мест 3 sizeof (int))
Теперь мы также знаем, что мы можем динамически выделять память для массива определенного типа (malloc в C, new в С++).
что заставляет меня задаться вопросом, является ли тот факт, что массив имеет для начала адрес первого поля массива и первое значение (значение в более позднем поле) при вызове с помощью скобки [0] - это массив [ 0] == * (array + 0) == * array (независимо от того, был ли массив объявлен "type * array" или "type array []" или "type array [size]" ) и "array", называемый таким образом, указатель или массив ( "type * array" или "type array []" или "type array [size]" ) - это адрес первого поля.
Я в конечном итоге думаю, и я хотел бы подтвердить это: массивы, когда даже объявленные квадратными скобками ([]), фактически представляют собой последовательность из n указателей, каждая из которых содержит (имеющую значение не как адрес) адрес блока памяти Bi, содержащего фактическое значение + эти ячейки памяти (B0,..., Bn, каждый из которых содержит фактические значения). так что когда и когда объявляется "int array [5]", программа фактически выделяет 5 соседних ячеек индексов P0, P1,.., P4 и 5 int, размещенных по всей памяти компьютера B0, B1,..., B4, где значение Pi является адресом Bi
![enter image description here]()
Я прав или неправильно!!?? Спасибо!
Ответы
Ответ 1
Массивы когда даже объявленные квадратными скобками ([]), фактически представляют собой последовательность из n указателей, каждая из которых содержит [...] адрес блока памяти Bi, содержащего фактическое значение + эти ячейки памяти
Неа.
Похоже, вы озадачены тем, что array[0] == *(array+0) == *array
может быть истинным как для массива, объявленного как int array[10];
и int *array = ...;
. Совершенно разумный вопрос; Нам говорят, что для указателя ptr
выражение *ptr
получает значение, на которое указывает указатель, поэтому, когда мы используем тот же синтаксис с массивом, где находятся адреса, которые мы разыскиваем?
Здесь секрет: Оператор индекса массива ([]
) не работает на массивах в C и С++. Когда вы применяете его к массиву, язык неявно преобразует массив в указатель на первый элемент массива. Таким образом, добавление в массив или разыменование массива, похоже, ведет себя так же, как добавление или разыменование указателя.
int array[10];
// These lines do exactly the same thing:
int *ptr1 = &array[0]; // explicitly get address of first element
int *ptr2 = array; // implicitly get address of first element
Таким образом, массивы действительно являются непрерывным набором элементов в памяти, где каждый элемент действительно является значением, а не указателем на другое местоположение, содержащее значение. Это просто, что способы определения массивов означают, что они часто конвертируются в указатель неявно, и поэтому кажется, что есть указатели, когда действительно существует только неявное преобразование.
Ответ 2
Массивы хранятся смежно в виртуальной памяти. Однако адреса физической памяти, которые они отображают, могут быть или не быть смежными.
И элементы массива не сохраняют указатель, указывающий на следующий элемент. Сохраняется только значение.
Ответ 3
Подумайте об этом так:
array[n]
- это просто синтаксический сахар для *(array + n)
.
И нет, нет указателей, массив фактически содержит значения в непрерывном диапазоне памяти.