Переменная указателя создана для локального массива стека?

0

Рассмотрим следующий код:

#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++?

Я хочу получить ответ для этих двух сред:

  1. GCC/Linux, x86
  2. Visual Stuidio 2013, x86
  • 0
    @ArunMu Это мало связано с вопросом.
  • 1
    Во-первых, int* dynArray = new int[5] отличается от типа int stackArray[5] .
Показать ещё 2 комментария
Теги:
arrays
pointers

2 ответа

5
Лучший ответ
  1. stackArray - это массив, а не указатель. Его тип - int[5], т.е. Массив из 5 целых чисел. Компилятор знает тип элементов массива, который является int. stackArray[index] оценивается как *(stackArray + index). Здесь массив stackArray вычисляет указатель на его первый элемент.

  2. C и C++ одинаковы с точки зрения массива, который имеет автоматическое распределение хранилища.

  • 1
    @juanchopanza Спасибо. Убрана вводящая в заблуждение часть.
  • 0
    Here, the array stackArray evaluates to a pointer to its first element : Хорошо, тогда где хранится этот результат оценки? Это оценивается (вычисляется) во время выполнения или во время компиляции?
Показать ещё 2 комментария
6
  • dynarray - переменная. Его тип - int *, и он имеет автоматическую продолжительность хранения ("в стеке"). Его значение является указателем на какой-то элемент в другом месте. Тот факт, что это указывает на элемент некоторого массива в другом месте, в какой-то степени случайный.

  • stackArray - переменная. Его тип - int[5] и он имеет автоматическую продолжительность хранения. Его значение представляет собой массив из пяти целых чисел. Когда вы используете имя переменной в выражении типа stackArray[index], это выражение обозначает соответствующий элемент массива (который является подобъектом объекта массива).

Обратите внимание, что в вашем примере массив, из которого dynarray[index] является элементом, сам по себе не является переменной и не является самим элементом. Вы можете обращаться к объектам элемента только потому, что у вас есть указатель на них. (И на самом деле вы вообще не можете выразить объект массива, так как его тип известен во время компиляции. Динамические массивы - это одна из частей C++, где у вас действительно динамическая типизация.)

  • 0
    Концептуально может быть полезно для OP говорить и о распаде массива.
  • 0
    stackArray[index], that expression denotes the corresponding array element : хорошо, но как это происходит? Это волшебным образом вычисляет ??? + index ? ??? должно быть что-то .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню