Почему параметр strlen является "const"? - PullRequest
3 голосов
/ 05 января 2012

Я изучаю язык C.

Мой вопрос: Почему параметр strlen является "const"?

size_t strlen(const char * string);

Я думаю, это потому, что строка - это адрес, поэтому он не меняется после инициализации. Если это правильно, значит ли это, что каждый раз, когда вы создаете функцию, используя указатель в качестве параметра, она должна быть постоянной?

Например, если я решу построить функцию, которая устанавливает переменную int равной double, она должна быть определена как:

void timesTwo(const int *num)
{
    *num *= 2;
}

или

void timesTwo(int *num)
{
    *num *= 2;
}

Или это вообще ничего не меняет?

Ответы [ 3 ]

7 голосов
/ 05 января 2012

Строка C - указатель на завершенную нулями последовательность символов. const перед char * указывает компилятору и программисту, вызывающему функцию, что strlen не собирается изменять данные, на которые указывает указатель string.

Этот момент легче понять, если взглянуть на strcpy:

char * strcpy ( char * destination, const char * source );

его второй аргумент - const, но его первый аргумент - нет. Это говорит программисту, что данные, на которые указывает первый указатель , могут быть модифицированы функцией, тогда как данные, на которые указывает второй указатель, останутся постоянными после возврата из strcpy.

4 голосов
/ 06 января 2012

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

Вот несколько комбинаций квалификатора const:

const char *s;            // s may be modified, *s may not be modified
char const *s;            // same as above
char * const s;           // s may not be modified, *s may be modified
const char * const s;     // neither s nor *s may be modified
char const * const s;     // same as above
4 голосов
/ 05 января 2012

Параметр для функции strlen является указателем на const, поскольку ожидается, что функция не изменит то, на что указывает указатель - она ​​должна что-то делать со строкой, не изменяя ее.

В вашей функции 'timesTwo', если вы намереваетесь изменить значение, на которое указывает 'num', вы не должны передавать его как указатель на const. Итак, воспользуйтесь вторым примером.

...