Зачем использовать "const *" перед объявлением аргумента функции в C? - PullRequest
0 голосов
/ 28 апреля 2020

что я имею в виду под этим вопросом, почему «const» используется до аргумента1 и аргумента2, не может ли это быть просто объявлением аргумента без конста? что const делает с аргументом? static bool example(const char * argument1, const char * argument2){...}

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

что я имею в виду под этим вопросом, почему «const» используется перед аргументом1 и аргумент2, не может ли это быть просто объявлением аргумента без констант?

Ваш пример касается параметров функции типа const char *. Здесь важно понимать, что этот тип обозначает указатель на const char, , а не a const указатель на символ. То есть сам указатель может быть изменен, но его нельзя использовать для изменения данных, на которые он указывает.

Существует несколько причин, по которым это полезно, среди них:

  • C позволяет передавать аргумент типа char * параметру типа const char *, но не наоборот. Поэтому, если функция все равно не намеревается изменять указанные данные, то объявление параметра как const char * делает функцию применимой к большему количеству случаев.

  • Объявление параметра как const char * гарантирует вызывающим сторонам, что даже если аргумент указывает на изменяемые данные (то есть имеет тип char *), функция фактически не будет изменять эти данные. Это важная гарантия во многих случаях.

  • Как частный случай предыдущего, строковые литералы, представленные в виде аргументов функции, распадаются на указатели типа char *, однако происходит неопределенное поведение если полученный указатель используется при попытке изменить значение строкового литерала. Поэтому нельзя считать безопасным передачу строкового литерала параметру типа char *, но достаточно безопасно передать его параметру типа const char *.

1 голос
/ 28 апреля 2020

Прототип функции - это контракт между функцией и ее пользователями

Спецификатор const, используемый в объявлениях параметров функции

bool example(const char * argument1, const char * argument2)

, дает гарантию, что указанные объекты не будут быть изменен.

Без такой гарантии вы не можете, например, передать в функцию строковый литерал, поскольку изменение строкового литерала приводит к неопределенному поведению.

Таким образом, квалификатор const делает программу более понятной и безопасной.

...