C ++:const char * const *的含义

时间:2012-04-05 13:05:18

标签: c++ pointers function-prototypes function-parameter

在其中一个C ++程序中,我看到了一个函数原型:int Classifier::command(int argc, const char*const* argv)

const char*const* argv是什么意思?它与const char* argv[]相同吗? const char** argv也意味着相同吗?

4 个答案:

答案 0 :(得分:7)

不,它与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

答案 1 :(得分:4)

来自C++ Super-FAQ

  

从右到左阅读指针声明。

     
      
  • const X* p表示“p指向X const”:X对象无法更改via p
  •   
  • X* const p表示“p是指向const X的{​​{1}}指针”:您无法更改指针{{1} }本身,但您可以更改non-const对象via p
  •   
  • p表示“p是指向X const X* const p的{​​{1}}指针”:您无法更改指针const本身,也不能您可以更改X对象via p
  •   
     

而且,是的,我是否提到从右到左阅读你的指针声明?

constp相同:指向const char的const指针的(非const)指针。

Xconst char * const *相同:指向const char的(非const)指针。

char const * const *const char *相同:指向const char的(非const)指针的(非const)指针。

答案 2 :(得分:4)

const char*const* argv表示“指向常量char的常量指针”。它与const char *argv[]不是“相同”,但它在某种程度上是兼容的:

void foo(const char *const *argv);

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

编译得很好。 (如果没有const_cast,则反向编译。)

答案 3 :(得分: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.