4

次のコードがあります

char str[] = "some string"; // legal
char const* str2 = str;     // legal
char const** str3 = &str2;  // legal
char const** str4 = &str;   // illegal (error: cannot convert 'char (*)[12]' to 'const char (*)[]' in initialization )

最後のものがコンパイルされないのはなぜですか? の型は&str何ですか?

4

2 に答える 2

7

は配列なのでstr、 の型は&str「12 の配列へのポインタconst char」です。有効な宣言は次のとおりです。

char const (*str4)[12] = &str;

の宣言は、配列からポインターへの変換を使用して初期化された、配列ではなく「へのポインター」であるstr3ため、正常に機能します。の宣言のように、配列のアドレスを取得する場合、同じ配列からポインターへの変換は行われません。str2const charstr4

于 2013-03-18T17:22:03.467 に答える
0

逆参照の数が多いためです。(str[] または str*) -> データ、str2 -> データ、str3 -> ポインター (str2) -> データ、str4 -> ポインター -> データ。* シンボルの数は、データを取得するために逆参照する必要がある多くの imes をホームに示します。毎回アドレスからアドレスへとジャンプしており、最後のアクセスのみが実際のデータです。

正しい方法は次のとおりです。

char const* str4 = &str; //or
char const* str4 = str2;
于 2013-03-18T17:26:25.010 に答える