Понимание функции strlen - Назначение const char * s для const char * sc - PullRequest
0 голосов
/ 16 января 2019

Ниже приведена реализация strlen.c согласно «Стандартной библиотеке C»,

size_t strlen(const char *s){
   const char *sc;
   for(sc = s; *sc != '\0'; ++sc)

   return (sc-s);  }

Правильно ли мое понимание законности sc = s?

sc=s является допустимым присваиванием, поскольку, поскольку обе переменные объявлены как const, обе защищают объект, на который указывает s. В этом случае допустимо изменить то, на что указывают sc или s, но любое присвоение (или ссылка?) На *s или sc будет недопустимым.

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Я думаю, что вы спрашиваете, что означает ключевое слово const . Если нет, пожалуйста, уточните свой вопрос.

Мне нравится думать, что любая переменная const может храниться в ПЗУ (постоянная память), а переменные, которые не объявлены как const, могут храниться в ОЗУ (оперативное запоминающее устройство). Этот тип зависит от типа компьютера, с которым вы работаете, поэтому данные const на самом деле могут не храниться в ПЗУ, но это может быть.

Таким образом, вы можете делать что угодно с самим указателем, но вы не можете изменять данные в памяти, на которую он указывает.

Это означает, что вы можете ссылаться на указатель и передавать его столько раз, сколько захотите. Также вы можете назначить другое значение указателю.

Скажем, у вас есть этот код

const char* foo = "hello";
const char* bar = "world";

Это совершенно законно

foo = bar;

Теперь обе точки "мира"

Это также разрешено делать

const char *myPtr = bar;
myPtr = foo;

Что вам не разрешено делать, так это изменять фактическую память данных, чтобы вам не разрешалось делать

foo[0] = 'J';
0 голосов
/ 16 января 2019

Правильно ли мое понимание законности sc = s?

Да, нужны только некоторые детали последней части.

... но любое присвоение (или ссылка?) На *s или sc было бы незаконным.

(я подозреваю, что OP означает "... или *sc будет незаконным.")

Ссылка на то, на что указывает s или sc, в порядке, как в char ch = *sc;

Попытка изменить значение *s или *sc равно неопределенное поведение (UB), а не "недопустимо", как в *sc = 'x';
(См. хорошие дополнительные детали по @ rici )

При использовании UB назначение может работать, оно может не работать по вторникам, может произойти сбой кода и т. Д. С не определяет, что происходит. Код достоверности не должен пытаться это сделать.

0 голосов
/ 16 января 2019

Вы правы.

const char * sc объявляет указатель на const char. По сути, это означает, что sc указывает на переменную типа char (или в этом случае непрерывный массив char s) и , который нельзя использовать sc для изменения указанной переменной , Смотрите вживую здесь .

Обратите внимание, что sc сама по себе является , а не a const переменной. const применяется к указанной переменной, а не к указателю. Таким образом, вы можете изменить значение указателя , то есть переменную, на которую он указывает.

Следуйте этому ответу, чтобы лучше понять различные варианты использования const и указателей: В чем разница между const int *, const int * const и int const *?

...