В C указатель используется для ссылки на адрес объекта в памяти:
int *pointerToFirstIndexOfArray = users[0]; // The int * value now points to the location in memory
Один использует & значение, чтобы получить фактическое значение адреса в памятивместо того, чтобы просто указать местоположение:
int a = 0;
int &b = a; // B is now a reference to A, since B is literally the address in memory of where A is located
Наконец, использование -> является сокращенной записью (*).:
(*users[i]).valueInsideUserStruct = someValue; // these statements are equal
users[i]->valueInsideUserStruct = someValue; // these statements are equal
C делает это, потому что легчечитайте var-> val вместо (* var) .val
Чтобы ответить на ваш вопрос, первый отправленный вами код изменяет только значение на адрес (оператор & буквально возвращает адрес), в то время как второй код, который вы опубликовали, фактически меняет значение на значение по адресу .