Рассмотрим следующий код:
#include <iostream>
int main()
{
int index;
std::cin >> index;
int* dynArray = new int[5];
dynArray[index] = 1;
int stackArray[5];
stackArray[index] = 1;
}
Я точно знаю, что dynArray
- простой указатель int*
и он принимает дополнительные sizeof(int*)
байты в стеке.
Вопрос 1: Добавлена ли дополнительная переменная указателя в стек для stackArray
? Если это так, всегда ли это происходит? Если нет, то как stackArray[index] = 1;
работать без знания базы массива, т.е. как компилятор решает, какое значение добавить в index
для вычисления адреса?
Вопрос 2: Есть ли разница между C/C++?
Я хочу получить ответ для этих двух сред:
stackArray
- это массив, а не указатель. Его тип - int[5]
, т.е. Массив из 5
целых чисел. Компилятор знает тип элементов массива, который является int
. stackArray[index]
оценивается как *(stackArray + index)
. Здесь массив stackArray
вычисляет указатель на его первый элемент.
C
и C++
одинаковы с точки зрения массива, который имеет автоматическое распределение хранилища.
Here, the array stackArray evaluates to a pointer to its first element
: Хорошо, тогда где хранится этот результат оценки? Это оценивается (вычисляется) во время выполнения или во время компиляции?
dynarray
- переменная. Его тип - int *
, и он имеет автоматическую продолжительность хранения ("в стеке"). Его значение является указателем на какой-то элемент в другом месте. Тот факт, что это указывает на элемент некоторого массива в другом месте, в какой-то степени случайный.
stackArray
- переменная. Его тип - int[5]
и он имеет автоматическую продолжительность хранения. Его значение представляет собой массив из пяти целых чисел. Когда вы используете имя переменной в выражении типа stackArray[index]
, это выражение обозначает соответствующий элемент массива (который является подобъектом объекта массива).
Обратите внимание, что в вашем примере массив, из которого dynarray[index]
является элементом, сам по себе не является переменной и не является самим элементом. Вы можете обращаться к объектам элемента только потому, что у вас есть указатель на них. (И на самом деле вы вообще не можете выразить объект массива, так как его тип известен во время компиляции. Динамические массивы - это одна из частей C++, где у вас действительно динамическая типизация.)
stackArray[index], that expression denotes the corresponding array element
: хорошо, но как это происходит? Это волшебным образом вычисляет ??? + index
? ???
должно быть что-то .
int* dynArray = new int[5]
отличается от типаint stackArray[5]
.