В чём суть сравнения массивов типа char на C?
Вы сравниваете указатели (почитайте по них в любой книжке про C).
Указатели - это адреса, на 64-битной системе представляемые 64-битными положительными числами. Как именно и в каком порядке им выдаются значения - внутреннее дело компилятора, но, как правило, адреса переменных на стеке действительно идут в порядке их объявления.
Вы сами поняли. Тут сравнивается память хотите сравнивать значения сравнивайте их

В более навороченных языках немного хитрее, например в c# для скорости строки неизменные и хранятся в области памяти и дубликаты имеют один адрес