C++
 Computer >> コンピューター >  >> プログラミング >> C++

C/C++における配列の減衰(Array Decay)とは?仕組みと注意点を解説

C/C++では、配列とポインタは非常によく似た挙動を示します。しかし、両者にはいくつかの微妙な違いが存在します。その代表例が、sizeof 演算子の挙動です。配列をポインタに変換すると、元の配列が持っていた情報の一部が失われます。これを「減衰(decay)」と呼びます。

サンプルコード

#include<iostream>

int main() {
    const int a[] = { 2, 3, 5, 7, 11 };
    const int* p = a;
    std::cout << ( sizeof(p) != sizeof(a) );
}

実行結果

1

なぜこのような結果になるのか

上記のコードでは、配列 a をポインタ p に代入しています。実行結果が 1(真)であることから、sizeof(p)sizeof(a) の値が異なることが分かります。

これは、sizeof をポインタに対して適用すると、配列全体のサイズではなくポインタ変数自体のサイズが返されるためです。例えば64ビット環境では、ポインタのサイズは通常8バイトですが、配列 a のサイズは int 型5個分で20バイトになります。

「減衰(decay)」とは何か

このように、配列をポインタとして扱う際に、配列のサイズや型情報といった属性が失われる現象を「減衰(array decay)」と呼びます。

C/C++では、配列は多くの場面で自動的に先頭要素へのポインタへと暗黙的に変換されます。関数に配列を渡す場合も同様で、実際にはポインタが渡されるため、関数側で sizeof を使っても元の配列サイズを取得することはできません。

減衰への対策

  • std::array を使う: C++では std::array を利用すれば、サイズ情報を保持したままコンテナを扱えます。
  • std::vector を使う: 動的なサイズ変更が必要な場合は std::vector が便利です。
  • 参照渡しを利用する: 関数の引数を配列への参照(int (&a)[5] など)にすれば、減衰を回避できます。

配列とポインタの違い、特に減衰の仕組みを理解しておくことは、C/C++で安全かつ正確なコードを書くために非常に重要です。

  1. LinuxでのC/C++開発におすすめのIDE 6選|特徴と選び方を解説

    テキストエディタだけでは大規模開発は難しい大規模なプロジェクトを単なるテキストエディタだけで管理するのは容易ではありません。そうしたケースでは、IDE(統合開発環境)を活用することで生産性が向上し、ストレスも大幅に軽減されます。IDEにはさまざまな種類があるため、自分のニーズに合ったものを選ぶことが重要です。この記事では、Linuxで利用できるC/C++向けの優れたIDEを6つご紹介します。1. NetBeans(C/C++開発向け)NetBeansは、無料かつオープンソースの人気クロスプラットフォームIDEです。C/C++をはじめ、多くのプログラミング言語に対応しており、コミュニティが開発し

  2. Windowsで使えるC++開発向けおすすめIDE 7選

    ```html 大規模なプロジェクトをプレーンなテキストエディターだけで管理するのは困難です。こうしたケースではIDE(統合開発環境)を使った方が、生産性が向上しストレスも大幅に軽減されます。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。ここでは、Windowsで利用できる優れたC/C++向けIDEをご紹介します。 1. Visual Studio Microsoftが開発した定番IDEです。Windows上でのC++プログラムの構築・開発・プロファイリングにおいて、最高クラスのツール群を備えています。豊富なプラグインストアも魅力で、Azure、PowerShe