Когда вы объявляете массив int
s, как вы сделали int array[] = { 1, 2, 3 };
и т. Д., То, что сделал компилятор, - это резервное пространство для (в данном случае) трех целых чисел в строке «в стеке» (памятьпространство, в котором хранятся локальные переменные во время выполнения функции).Название для этого пространства array
.
Взяв адрес первого элемента, например &array[0]
, вы получите адрес первого из этих целых чисел, как вы и ожидаете.Этот адрес указывает на небольшой кусок памяти в кадре стека функции.
Во втором случае вы спрашиваете адрес «переменной с именем array
», верно?Ну, эта переменная ... те же самые три целых числа в стеке.И адрес этой вещи совпадает с адресом первого элемента.Вот почему эти значения одинаковы.
Вы заметили, что в вашем учебнике написано, что последняя версия на самом деле неизвестна.Я не специалист по стандартам в этом вопросе, но в этом есть какой-то смысл - не очень идиоматично использовать эту вторую форму, потому что вы можете просто сказать array
, которая также представляет то же самое и более разумно.
Однако все изменится, если вы выделите этот массив динамически.Если вы сделаете это:
int * dynamic_array = malloc(3 * sizeof(int));
... тогда вы по-прежнему создадите «массив» на практике, но хранилище для этих трех целых чисел больше не будет в стеке;он был выделен динамически из кучи.В этом случае &dynamic_array[0]
все равно даст вам адрес первого элемента.Этот адрес совпадает со значением, которое содержится в переменной dynamic_array
.Обратите внимание, что в этом случае это не то же самое , как говорится &dynamic_array
.Взяв здесь адрес указателя dynamic_array
, вы получите адрес указателя в стеке (т. Е. int **
).