49802


配列の要素数を得る方法なのですが`int z[50];`の場合は以下の例で50と変数に入るのですが。  
なぜポインターにnew intしてから要素数を得ようとすると1と表示されるのでしょうか？  
また、どうしたら要素数を得られるのか教えてくれますでしょうか？

[code]

    int main() {
    
        int *x;
        x = new int[50];    
        int z[50];
    
        int a = sizeof(z) / sizeof(z[0]);
        int b = sizeof(x) / sizeof(x[0]);
        cout << a << endl;
        cout << b << endl;
    
    
    
        _getch();
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2018-10-30T11:32:23.800
49800
2018-10-31T07:01:16.300
2018-10-31T07:01:16.300
2238
question
c++
new int[ix];で動的確保した配列の要素数を獲得する方法


質問１の答：  
`sizeof (x)` はポインタの大きさを得ます (32bit ならたいてい 4)  
`sizeof(x[0])` は `int` の大きさを得ます (32bit ならたいてい 4)  
なので `4/4==1` を得るだけのことです。 64bit Windows 用コンパイラなら別の値を得るでしょう。

質問２の答：  
どの処理系でも通用する方法はただ一つ、自分で覚えておくことです。

[code]

    struct myvector {
        int* p; // new int [size] の結果
        int size; // 事前に new したい数を記憶しておく
    };
    
[/code]

これを自分で行うのはあまりにも馬鹿らしいので `std::vector` を使うとよいでしょう。 `vector` は端的には `new
T[capacity]` のラッパ (Wrapper) です。必要な時に自動で `delete[]` してくれて便利便利。  
\- `vector.capacity` は `new T[capacity]` したってこと  
\- `vector.size` はそのうち、ユーザーが「使っている」と宣言した個数  
要素を１００個用意しても `vector.reserve(100)` 、３０個しか使っていない
`vector.size()==30`ってのはよくある話。このとき残り７０個はリロケーションなしに `vector.push_back` できる。


CC BY-SA 4.0
2018-10-30T11:57:37.190
49802
2018-10-30T12:24:41.083
2018-10-30T12:24:41.083
8589
8589
49800
answer