С++: Значение const char * const *

В одной из программ на С++ я увидел прототип функции: int Classifier::command(int argc, const char*const* argv)

Что означает const char*const* argv? Это то же самое, что и const char* argv[]? Значит ли const char** argv то же самое?

Ответ 1

Нет, это не то же самое, что 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

Ответ 2

Из С++ 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.

Ответ 3

Указатель, который не изменяется на строку, которая не изменяется:

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.

Ответ 4

const char*const* argv означает "указатель на постоянный указатель на константу char". Он не "тот же", что и const char *argv[], но он в некоторой степени совместим:

void foo(const char *const *argv);

void bar(const char **argv)
{
    foo(argv);
}

компилируется просто отлично. (Обратное не будет компилироваться без const_cast.)