C ++プログラムの1つで、関数プロトタイプを見ました。int Classifier::command(int argc, const char*const* argv)
どういうconst char*const* argv
意味ですか?と同じconst char* argv[]
ですか?const char** argv
同じ意味ですか?
C ++プログラムの1つで、関数プロトタイプを見ました。int Classifier::command(int argc, const char*const* argv)
どういうconst char*const* argv
意味ですか?と同じconst char* argv[]
ですか?const char** argv
同じ意味ですか?
C ++スーパーFAQから:
ポインタ宣言を右から左に読んでください。
const X* p
「は」p
を意味します:オブジェクトはを介して変更することはできません。X
const
X
p
X* const p
「は」へp
のconst
ポインタであるX
ことを意味non-const
します。ポインタp
自体を変更することはできませんが、を介しX
てオブジェクトを変更することはできます。p
const X* const p
「pはaconst
へのポインタ」を意味します。ポインタ自体を変更することも、を介してオブジェクトを変更することもX
できません。const
p
X
p
そして、そうそう、私はあなたのポインター宣言を右から左に読むことに言及しましたか?
const char * const *
と同じchar const * const *
です:const文字へのconstポインタへの(非const)ポインタ。
const char *
と同じchar const *
です:const charへの(非const)ポインタ。
const char * *
と同じchar const * *
です:const charへの(non-const)ポインタへの(non-const)ポインタ。
いいえ、と同じではありません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
const char*const* argv
「定数へのポインタ」を意味しますchar
。と「同じ」ではありませんconst char *argv[]
が、ある程度互換性があります。
void foo(const char *const *argv);
void bar(const char **argv)
{
foo(argv);
}
うまくコンパイルします。(逆は、なしではコンパイルされませんconst_cast
。)
変更されない文字列に変更されないポインタ:
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.