Как массивы работают внутри c/С++ - программирование
Подтвердить что ты не робот

Как массивы работают внутри 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

Я прав или неправильно!!?? Спасибо!

4b9b3361

Ответ 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).

И нет, нет указателей, массив фактически содержит значения в непрерывном диапазоне памяти.