У меня есть простая функция 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;