-4
int main(int argc, char** argv) {
char a[2][5]={"hell","worl"};

char **p;
p=a;  // error here
cout<<*(*(a+1)+1);
cout<<endl;
cout<<(*a)[2];
return 0;
}

エラー:

C:\Dev-Cpp\main.cpp [Error] initializer-string for array of chars is too long [-fpermissive]
4

2 に答える 2

3

なぜそれが機能すると期待するのですか?as を宣言pchar**、それに 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が望ましいです。)

于 2013-09-26T12:54:43.327 に答える