なぜそれが機能すると期待するのですか?as を宣言p
しchar**
、それに a を代入しようとしchar[2][5]
ています。はchar[2][5]
暗黙的に に変換されchar (*)[5]
ますが、その後はポインターがあり、それ以上の暗黙的な変換はありません。(編集: を除くvoid*
。)
考えてみれば明らかなはずです。a を逆参照するchar**
と、 が得られますchar*
。そして、これchar*
へのポインタがあるため、これはメモリのどこかに存在する必要があります。それで、それはどこですか?
例で外側の配列を反復処理する場合:
char (*p)[5] = a;
std::cout << *p[0] << sdt::endl;
std::cout << *p[1] << sdt::endl;
*(*(a+1)+1)
式は、どこかにポインターの配列があることも想定していることに注意してください。
または、C スタイルの文字列を操作する場合は、通常の解決策を使用できます。
char const* const a[] = { "hell", "worl" };
と
char const* const* p = a;
この場合、ポインターの配列があり、暗黙的にポインターへのポインター (配列の最初の要素) に変換されます。
(もちろん、C スタイルの文字列を実際に使用したいのは、静的な有効期間を持つ const 変数を使用する場合だけです。他のほとんどの場合は、std::string
が望ましいです。)