21

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

是什么const char*const* argv意思?是一样的const char* argv[]吗?const char** argv是不是也一样的意思?

4

4 回答 4

13

来自C++ 超级常见问题解答

从右到左阅读指针声明。

  • const X* p意思是“p指向X那个是const”:X对象不能通过p.
  • X* const p表示“pconst指向”X的指针non-const:您不能更改指针本身p,但可以通过.Xp
  • const X* const p表示“p 是const指向 anX的指针const”:您不能更改指针本身p,也不能通过.Xp

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

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

const char *等同于char const *:指向 const char 的(非常量)指针。

const char * *等同于char const * *:指向 const char 的(非常量)指针的(非常量)指针。

于 2012-04-05T13:08:49.417 回答
10

不,它不一样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
于 2012-04-05T13:08:57.897 回答
4

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

void foo(const char *const *argv);

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

编译就好了。(如果没有 .,反向将无法编译const_cast。)

于 2012-04-05T13:09:44.053 回答
2

一个不改变的指针指向一个不改变的字符串:

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.
于 2012-04-05T13:09:28.497 回答