2012-04-05 5 views
11

Dans l'un des programmes C++, j'ai vu un prototype de fonction: int Classifier::command(int argc, const char*const* argv)C++: Signification de const char * const *

Qu'est-ce que cela signifie const char*const* argv? Est-ce la même chose que const char* argv[]? Est-ce que const char** argv signifie également la même chose?

+7

http://cdecl.org/ –

+1

@LuchianGrigore yep, l'ai obtenu –

+1

Lire (principalement) de droite à gauche, pointeur vers un pointeur const (const char) . –

Répondre

5

Non, ce n'est pas la même chose que const char *argv[]. Le const interdit les modifications de la valeur déréférencé au niveau particulier de déréférencement:

**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 
3

De C++ FAQ Lite:

Fred const * const p signifie "p est un pointeur constant à une constante Fred": vous ne pouvez pas changer le pointeur p lui-même, et vous ne pouvez changer l'objet Fred via p .

const char * const * est le même que char const * const *: un pointeur (non-const) à un pointeur vers un const const char.

const char * est le même que char const *: un pointeur (non-const) vers un const const. Est

const char * * est le même que char const * *: un pointeur (non-const) vers un pointeur (non-const) vers un const const.

3

Un pointeur qui ne change pas d'une chaîne qui ne change pas:

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. 
3

const char*const* argv signifie « pointeur vers pointeur constant à constante char ". Ce n'est pas « le même » que const char *argv[], mais il est compatible dans une certaine mesure:

void foo(const char *const *argv); 

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

compile très bien. (L'inverse ne compilerait pas sans const_cast.)