Можем ли мы объявить функции указателей в C или это что-то другое?

Я нашел это на geeksforgeeks

char *getString()
{
char *str = "Nice test for strings";
return str;
}

int main()
{
printf("%s", getString());
getchar();
return 0;
}

Вывод: «Хороший тест для строк»

Я пробовал искать функции указателя, но это не так. Если бы вы могли указать мне, чтобы узнать, как это делается. Это было бы хорошо


person Joe Robin    schedule 19.04.2021    source источник
comment
Функции указателя? Вы говорите о char *getString()? Это функция, возвращающая char*.   -  person tkausl    schedule 19.04.2021
comment
Функции указателя? Это не стандартная терминология. getString — это функция, и она возвращает указатель.   -  person MSalters    schedule 19.04.2021
comment
Если вы просите вернуть указатели из функций, указатель должен выделяться динамически. Или он должен быть статическим/глобальным. Локальные указатели будут потеряны из указателя стека, когда функция вернется.   -  person Nina    schedule 19.04.2021
comment
@Nina Если вы просите вернуть указатели из функций, указатель должен выделяться динамически. Или он должен быть статическим/глобальным. Локальные указатели будут потеряны из указателя стека, когда функция вернется. Учитывая char *str = "Nice test for strings";, куда, по вашему мнению, указывает указатель str?   -  person Andrew Henle    schedule 19.04.2021
comment
@AndrewHenle Он указывает на хороший тест для строк, но его возврат не гарантирует, что указатель всегда будет указывать на него. Когда вызываются другие функции или выделяются другие переменные, указатель стека будет смещаться, и этот указатель будет потерян.   -  person Nina    schedule 19.04.2021
comment
@Nina Строковой константы нет в стеке. В стеке находится только str, а значение str возвращается. Вы можете безопасно возвращать значение переменной в стеке. В противном случае int i = 3; return i; не будет в безопасности.   -  person David Schwartz    schedule 19.04.2021
comment
О, я забыл, что литералы статичны.   -  person Nina    schedule 19.04.2021
comment
@Nina Он указывает на хороший тест для строк, но его возврат не гарантирует, что указатель всегда будет указывать туда.... Ой. Если бы я мог понизить комментарий, я бы это сделал. char *str = "Nice test for strings"; означает, что ptr указывает на строковый литерал, который неявно равен static. Возвращается значение, содержащееся в str - по значению, поэтому адрес, возвращаемый по значению, всегда будет ссылаться на строковый литерал.   -  person Andrew Henle    schedule 19.04.2021
comment
Неясно, спрашиваете ли вы о функциях, возвращающих указатели, или об указателях на функции. Вы пишете: «Я пробовал искать функции указателя, но это не то». Местоимения в этом предложении неясны; «это» из «его» может быть результатом поиска или «функциями указателя» или чем-то еще, а «это» может быть кодом, который вы показали, или «функциями указателя» или чем-то еще. Перепишите свой вопрос, чтобы было понятно, о чем вы спрашиваете.   -  person Eric Postpischil    schedule 19.04.2021
comment
@AndrewHenle Возвращается значение, содержащееся в str, по неверному значению. Указатель на значение по-прежнему возвращается, но поскольку строка является статической, данные содержатся. Указатель на статическую строку по-прежнему возвращается.   -  person Nina    schedule 19.04.2021
comment
geeksforgeeks.org/function-pointer-in-c   -  person Stef1611    schedule 19.04.2021
comment
@Nina Возвращается значение, содержащееся в str, - по значению верно. Значение str является указателем и возвращается по значению   -  person Stefan Riedel    schedule 19.04.2021
comment
@Nina: значение, содержащееся в str, является адресом. C 2018 6.2.5 20 говорит: «… Тип указателя описывает объект, значение которого предоставляет ссылку на объект указанного типа». Символы по этому адресу не содержатся в str. return str; возвращает значение str.   -  person Eric Postpischil    schedule 19.04.2021
comment
Это было закрыто как дубликат вопроса о возврате указателя из функции, но я не уверен, что именно это на самом деле спрашивает OP. Мне кажется, что он спрашивает об указателях функций... Если это так, то это лучший вариант, чтобы пометить его как дубликат: stackoverflow.com/questions/840501/   -  person Basya    schedule 19.04.2021


Ответы (1)


Кажется, вы думаете, что здесь объявлен указатель на функцию

char *getString()

Но это предположение неверно.

Объявляется функция getString, возвращающая указатель типа char * на строковый литерал "Nice test for strings".

Поскольку строковые литералы имеют статическую продолжительность хранения, возвращаемый указатель будет действительным после выхода из функции.

Указатель на функцию может выглядеть так

char * ( *getStringPtr )() = getString;

затем, используя этот указатель, вы можете вызвать функцию, например

printf("%s", getStringPtr());
person Vlad from Moscow    schedule 19.04.2021