2016-05-06 4 views
1

プログラムをデバッグしようとすると、私は面白いことに遭遇し、このことの意味を疑問に思っていました。ダイナミックアレイとスタティックアレイの型名が異なるのはなぜですか? (C++)

私は、配列を動的にまたは静的に定義して、異なるタイプ名を得ることに気付きました。例

#include <iostream> 
#include <typeinfo> 
int main() 
{ 
    int a[10]; 
    int *b = new int[10]; 
    int c[5][10]; 
    int **d = new int*[5]; 
    for (size_t i = 0; i < 5; ++i) 
     d[i] = new int[10]; 
    std::cout << typeid(a).name() << std::endl; 
    std::cout << typeid(b).name() << std::endl; 
    std::cout << typeid(c).name() << std::endl; 
    std::cout << typeid(d).name() << std::endl; 
    return 0; 
} 

のために私は出力

A10_i 
Pi 
A5_A10_i 
PPi 

を取得し、私はHDF5形式にPPiデータを書き込むの問題を有するが、これらのタイプが異なっていて、どのようにそれらが異なる理由として興味がありますしています。

+4

「b」と「d」は配列ではなく、(ヒープ割り当て配列の最初の要素への)ポインタです。出力から集めると、「A」は配列、「P」は配列、ポインタ用です。 –

+2

配列はC++で独自の型を持っています。おそらく、関数にパラメータとして渡されたときにポインタに崩壊するので、あなたは混乱しているでしょう。 – 101010

+0

私は混乱がどこにあるのかと思います。彼らの私の使用の大部分について、彼らは同じように行動しました。私はそれが「Pointer int」であることを理解していますが、彼らは行動が違っていることを認識しませんでした。私は興味があります。 –

答えて

3

実際にの静的またはの動的のようなものはありません。 の静的ストレージ割り当て,ダイナミックストレージ割り当ておよびポインタがあります。これらのそれぞれには独自のタイプがあります。 静的記憶域割り当ては、そのサイズについて固定された独自のタイプになります。

通常、ポインタは、それが配列を指している情報とそのサイズを失います。
生の配列(例:int arr[13]; int* p = arr;)と宣言されているか、またはnew [](たとえばint* p = new int[13];)で動的に割り当てられていますか?

関連する問題