Если вы return
указатель из вызываемой функции, вы не возвращаете ссылку на сам указатель.
Вместо этого значение указателя - фактически адрес первого элемента строкового литерала, здесь fe "int_1 < int_2"
, назначенный ему - возвращается по значению , но не сам указатель по ссылке .
Сам строковый литерал находится в постоянной памяти до завершения программы.
Фактически, как указатель на char
(char *
), так и массив char
(char[]
) имеют один и тот же класс хранения auto
и видны только функции compare_int
(имеют локальную область действия).
После того, как функция была выполнена один раз, они оба больше не существуют (в памяти ) и, следовательно, также больше не видны.
Значение, используемое в вызове printf()
, на самом деле является адресом первого элемента строкового литерала, переданного по значению . Это не имеет ничего общего с указателем в вызываемой функции, здесь strN
.
Строковый литерал не связан с указателем c.
Были бы они квалифицированы с помощью спецификатор класса хранения static
, тогда их объекты будут существовать в памяти до завершения программы, сохранят свои значения через различные вызовы функций и будут видны везде, где вы получили ссылку на их фактические объекты с помощью переданных на них указателей в вызывающей стороне (s ).
Но даже в этом случае возвращаемый указатель не является ссылкой на сам указатель, его значение - адрес первого элемента строкового литерала - возвращается по значению.
Вы можете представить себе это еще лучше, если вы подумаете о указателе в вызываемой функции как о «держателе» или, еще лучше, о «доставщике», например о том, кто дружелюбно доставляет ваши товары с Amazon. Он / она владеет адресом только определенное время, но после этого передает значение другому лицу.
Аналогично происходит при возврате значения адреса из compare_int
. Указатель в вызываемой функции strN
передает значение адреса вызывающей стороне. Здесь он принимается как аргумент для printf()
.