Это происходит потому, что строковый литерал рассматривается как const char
массив. Код эквивалентен написания этого:
char array [] = "Hello";
printf("%s\n", array);
printf("%s\n", &array);
- Когда вы передаете имя массива в функции, ожидающей указатель, массив «затухает» в указатель.
- Когда вы передаете адрес массива, вы получаете указатель на массив ... который также указывает на тот же адрес.
Это довольно запутанно, и я думаю, что C FAQ объясняет это хорошо. Вся эта глава о массивах и указателях должна быть обязательной для всех программистов C.
Другое дело, стоит отметить: оптимизаторы использовать что-то вызов «строка пула», что означает, что если компилятор встречает ту же строку буквального дважды в коде соусе, она будет хранить его по тому же адресу. Таким образом, ваш код на самом деле просто печатает содержимое одной и той же ячейки памяти дважды. Для того, чтобы увидеть, если используется строка пулы, просто запустите этот код:
printf("%p\n", "Hello");
printf("%p\n", "Hello");
Он должен печатать один и тот же адрес в два раза, до тех пор, как строки идентичны. Измените одну из строк, и вы получите разные адреса.
Нет ссылок в C. Унарный '&' является адресом оператора. – us2012
@alkis Вы не редактировали заголовок? – devnull
Какой компилятор вы используете, BTW? – devnull