Разница между массивом и массивом [0] в C - PullRequest
0 голосов
/ 01 марта 2019

Учитывая это объявление:

int array [] = ....;

Я знаю, что & array [0] имеет адрес первого элемента какего значение.

А как насчет & array ?Я попробовал это в моей программе, и он также возвратил адрес первого элемента.Так в чем же разница?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Попробуйте "разницу между 'A', 65LL и 65.0?

Все имеют значения, которые равны друг другу (при условии ASCII), но имеют разные типы ивероятны различные битовые ширины и кодировки.

Теперь "разница между &array и &array[0]"

Оба имеют значения, которые приравниваются друг к другу как точка к одному и тому же месту в памяти, ноони различаются по типу type : указатель на массив int и указатель на int.

int a[] = {1,2,4};
// &a is a `pointer to array 3 of int`

Общий эффект этого различия типов заключается в математике указателя

printf("%p\n", (void*) (&a[0] + 1));  // next `int` address
printf("%p\n", (void*) (&a + 1));     // one past end of array address

[Advanced]: Хотя обычно 2 указателя используют одинаковое кодирование и размер, в C они могут также различаться по кодированию и размеру, но при этом указывать на один и тот же адрес.

0 голосов
/ 01 марта 2019

Когда вы объявляете массив 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 **).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...