C: const vs no const .. почему это скомпилировано?

У меня есть простая функция C, которую я объявляю как:

int strLen(const char* str_) { str_ = (char*) 0; return 0; } 

Я был очень удивлен, что это компилируется! Это почему?

В то время как это не компилируется (что имеет смысл):

 int str(const int i_) { i_ = 0; return 0; } 

Поскольку const char* str_ говорит, что str_ является указателем на const-символы.

Вы можете изменить str_ самостоятельно, но не то, на что оно указывает.

 int strLen(const char* str_) { str_ = (char*) 0; /* allowed */ str_[0] = '\0'; /* not allowed */ return 0; } 

В первом вы меняете то, на str_ указывает указатель str_ ; указатель str_ не const; он просто указывает на данные const. Вы можете сделать указатель const следующим образом:

 int strLen(const char* const str_) 

Это следует за конвенциями C-деклараций,

 char *str; 

означает, что *str даст вам char (или, другими словами, str является указателем на символ). Так же,

 const char *str; 

означает, что *str даст вам const char , или, другими словами, str является указателем на константный символ. Таким образом, вам не разрешено изменять *str , но вы можете изменить str .

Если вы хотите сделать str const , используйте следующий синтаксис:

 char *const str;