在其中一个C ++程序中,我看到了一个函数原型:int Classifier::command(int argc, const char*const* argv)
const char*const* argv
是什么意思?它与const char* argv[]
相同吗?
const char** argv
也意味着相同吗?
答案 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)
从右到左阅读指针声明。
const X* p
表示“p
指向X
const
”:X
对象无法更改viap
。X* const p
表示“p
是指向const
X
的{{1}}指针”:您无法更改指针{{1} }本身,但您可以更改non-const
对象viap
。p
表示“p是指向X
const X* const p
的{{1}}指针”:您无法更改指针const
本身,也不能您可以更改X
对象viap
。而且,是的,我是否提到从右到左阅读你的指针声明?
const
与p
相同:指向const char的const指针的(非const)指针。
X
与const 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.