В одной из программ на С++ я увидел прототип функции: int Classifier::command(int argc, const char*const* argv)
Что означает const char*const* argv
? Это то же самое, что и const char* argv[]
?
Значит ли const char** argv
то же самое?
В одной из программ на С++ я увидел прототип функции: int Classifier::command(int argc, const char*const* argv)
Что означает const char*const* argv
? Это то же самое, что и const char* argv[]
?
Значит ли const char** argv
то же самое?
Нет, это не то же самое, что const char *argv[]
. const
запрещает модификации разыменованного значения на определенном уровне разыменования:
**argv = x; // not allowed because of the first const
*argv = y; // not allowed because of the second const
argv = z; // allowed because no const appears right next to the argv identifier
Из С++ FAQ Lite:
Fred const * const p означает, что "p - постоянный указатель на константу Fred": вы не можете изменить указатель p самостоятельно, и вы не можете изменить объект Fred через p.
const char * const *
совпадает с char const * const *
: a (не const) указатель на указатель const на const char.
const char *
совпадает с char const *
: a (не const) указатель на const char.
const char * *
совпадает с char const * *
: a (не const) указателем на (неконстантный) указатель на const char.
Указатель, который не изменяется на строку, которая не изменяется:
const char* aString ="testString";
aString[0] = 'x'; // invaliv since the content is const
aString = "anotherTestString"; //ok, since th content doesn't change
const char const* bString = "testString";
bString [0] = 'x'; still invalid
bString = "yet another string"; // now invalid since the pointer now too is const and may not be changed.
const char*const* argv
означает "указатель на постоянный указатель на константу char
". Он не "тот же", что и const char *argv[]
, но он в некоторой степени совместим:
void foo(const char *const *argv);
void bar(const char **argv)
{
foo(argv);
}
компилируется просто отлично. (Обратное не будет компилироваться без const_cast
.)