1. ホーム
  2. c++

[解決済み] sizeof(arr) / sizeof(arr[0])はどのように機能するのですか?

2022-03-04 21:24:45

質問

forループで配列のサイズを調べるとき、次のように記述している人を見かけたことがあります。

int arr[10];
for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){}

どのように sizeof(arr) / sizeof(arr[0]) は配列の長さですか?技術的にはどうなのでしょうか?

どのように解決するのですか?

もし array では sizeof(array) は、配列が占めるバイト数を返します。各要素は 1 バイト以上の領域を占有することがあるので、 結果を 1 要素のサイズで割る必要があります ( sizeof(array[0]) ). これで、配列の要素数がわかります。

std::uint32_t array[10];

auto sizeOfInt = sizeof(std::uint32_t); // 4
auto numOfBytes = sizeof(array); // 10*sizeOfInt = 40
auto sizeOfElement = sizeof(array[0]); // sizeOfInt = 4
auto numOfElements = sizeof(array) / sizeof(array[0]); // numOfBytes / sizeOfElement = 40 / 4 = 10

ライブ例

なお、関数に配列を渡した場合、配列はポインタに分解され sizeof(array) はポインタの大きさを返します。

std::size_t function(std::uint32_t a[]) // same for void function(std::uint32_t a[10])
{
    return sizeof(a); // sizeof(std::uint32_t*)!
}

std::uint32_t array[10];
auto sizeOfArray = function(array); // array decays to a pointer inside function()

ライブ例2