Когда вы пишете:
ITEM items[n];
вы создаете массив ITEM
с длиной n
, вся память для данных выделяется в стеке. Когда вы используете переменную items
, она теперь ссылается на первый элемент в массиве items[0]
, она похожа на указатель, но есть некоторая дополнительная информация о ее длине.
Когда вы пишете:
ITEM *ITEMcopy;
вы создаете указатель с именем ITEMcopy
, который может содержать местоположение ITEM
, но для любого ITEM
не выделена память, ITEMcopy
просто используется для указания на уже существующий ITEM
Если вы назначите его:
ITEM *ITEMcopy = items;
ITEMcopy
указывает на местоположение первого ITEM
в items
. Так что ITEMcopy
теперь является указателем на первый элемент в items
.
Когда вы пишете:
ITEM *ITEMcopy = &items;
Это предупреждение, потому что items
уже действует как указатель. Таким образом, &items
является указателем на указатель на ITEM
, который не совместим с ITEMcopy
, который ожидает указатель на ITEM
Функция sort
должна выглядеть примерно так:
void sort(ITEM *items, int n)
Чтобы использовать функцию сортировки:
ITEM items[n];
sort(items, n);
Использование переменной в функции:
void sort(ITEM *items, int n)
{
// could swap items[0] and items[1] like this
ITEM itemBuf;
memcpy(&itemBuf, &items[0], sizeof(ITEM));
memcpy(&items[0], &items[1], sizeof(ITEM));
memcpy(&items[1], &itemBuf, sizeof(ITEM));
}