21

C ++プログラムの1つで、関数プロトタイプを見ました。int Classifier::command(int argc, const char*const* argv)

どういうconst char*const* argv意味ですか?と同じconst char* argv[]ですか?const char** argv同じ意味ですか?

4

4 に答える 4

13

C ++スーパーFAQから:

ポインタ宣言を右から左に読んでください。

  • const X* p「は」pを意味します:オブジェクトはを介して変更することはできません。XconstXp
  • X* const p「は」へpconstポインタであるXことを意味non-constします。ポインタp自体を変更することはできませんが、を介しXてオブジェクトを変更することはできます。p
  • const X* const p「pはaconstへのポインタ」を意味します。ポインタ自体を変更することも、を介してオブジェクトを変更することもXできません。constpXp

そして、そうそう、私はあなたのポインター宣言を右から左に読むことに言及しましたか?

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)ポインタ。

于 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 に答える