だから、私たちは、私は配列を持っているとしましょう:私は私のマシン上で、「A」の種類を確認した場合Tの配列がTへのポインタに崩壊したら、再びTの配列にすることはできますか?
int a[3] = { 1, 2, 3 };
は今、私が取得:
今cout<<typeid(a).name(); // prints 'A3_i'
私はアドレスを取る場合「A」の(私の心の中で「アドレスを取っ」とは逆の動作である「デリファレンス」ので、私は本当に好きなもの)、そのアドレスを逆参照、タイプは変更されません:
cout<<typeid(*&a).name(); // also prints 'A3_i'
しかし、私derefere場合まず最初にnce 'a'を入力し、そのアドレスを取ってください。タイプはに変更されます(これは私が嫌いではないことを認めています。 )がintが、私はへのポインタint型を取得する必要があり、それは私が判明:アレイ型がに減衰した後は
1):だからここ
cout<<typeid(&*a).name(); // prints 'Pi'
は私の二つの質問ですポインタ型の場合、配列型に戻すにはどうしてですか?
私は鋳造様お-ジャスト・ドント・ケアの明確な戦略を試してみました:
cout<<typeid((int[3]) &*a).name(); // does not compile
// "error: ISO C++ forbids casting to an array type `int [3]'"
が働くだろうが、他のキャストですか?それとも、このタイプの変換は厳密に制限されていませんか?
2)アレイ型に戻ることができるかどうかにかかわらず、正確にどんな情報がスライスされ、崩壊からポインタへの処理で失われますか?
私は、ポインタ型と配列型が同等ではないことを理解しています。私は、配列型がポインタ型に格納されている情報の厳密なスーパーセットであると仮定します。これは正しいと思いますか?
私は他の質問では、配列型の余分な情報は次のとおりです:配列がスタック上にあるかどうか、またそのサイズについての知識(何とか配列のサイズを知っていなければならないタイプの一部です、そうですか?)配列型に他の情報が隠されていますか?
int []は型ですが、int [3]は型ではありません。 –
@Daniel: "3つのintの配列"は "int []"とは明確に区別され、 "int [3]"は前者のための合理的な省略表現のようです。 –
あなたの言うことは何でも。 –