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

sizeof演算子を使わずにC/C++で配列のサイズ(要素数)を求める方法

この記事では、C/C++において sizeof 演算子を使用せずに、配列のサイズ(要素数)を求める方法を解説します。ポインタ演算の仕組みを利用することで、配列の長さを動的に取得できます。

アルゴリズム

この手法は、配列へのポインタと通常のポインタの違いを利用したものです。処理の流れは以下の通りです。

Begin
   配列の要素を初期化する。
   &a => 配列全体へのポインタ。a と同じメモリアドレスを指すが、型が「配列」である点が異なる。
   &a + 1 => 配列の終端の次のアドレスを指す。
   *(&a + 1) => 参照外しにより、最後の要素の直後のアドレスを取得できる。
   *(&a + 1) - a => 先頭要素へのポインタとの差分を取ることで、配列の長さが求まる。
   サイズを出力する。
End.

ポイント解説

このテクニックの鍵となるのは、&a の型が「int (*)[N]」(配列全体へのポインタ)であることです。&a + 1 とすると、ポインタは要素1つ分ではなく「配列全体1つ分」だけ進むため、結果として配列の終端の次のアドレスを指します。

そのアドレスから先頭要素へのポインタ a を引くと、その差は int 型のサイズで割り算された値(要素数)になります。これはポインタ減算の規則によるものです。

サンプルコード

#include <iostream>
using namespace std;
int main() {
   int a[] = {6,7,5,3,1,4,2,10,9};
   int s = *(&a + 1) - a;
   cout << "Number of elements in array is " << s;
}

実行結果

Number of elements in array is 9

注意点

この方法は学習目的や特定の場面では有効ですが、実際の開発では sizeof(a) / sizeof(a[0]) を使うか、C++では std::size() や std::array を利用する方が安全で可読性も高いため推奨されます。また、配列が関数の引数として渡されるとポインタに退化するため、この手法は配列が定義されたスコープ内でのみ機能します。

  1. C++で条件演算子を使わずに配列の最大要素を求める方法

    問題の概要 いくつかの要素を含む配列 A があるとします。この配列 A の中から最大の要素を見つけたいのですが、条件演算子を一切使用してはならないという制約が課されています。例えば、A = [12, 63, 32, 24, 78, 56, 20] という配列が与えられた場合、求める最大要素は 78 です。 解決のアプローチ:ビット演算を活用する この問題を解くカギとなるのがビット単位のAND演算です。基本的な考え方は次の通りです。 まず、すべてのビットが 1 になっている特殊な値 INT_MAX を配列に 1 つ追加します。 続いて、最上位ビット(第31ビット)から最下位ビット(第0ビット)

  2. C#でsizeofを使わずに変数のサイズを取得する方法

    はじめにC#では、通常、変数のサイズ(バイト数)を取得するには sizeof 演算子を使用します。int x; x = sizeof(int);しかし、sizeof を使わずに変数のサイズを取得したい場合もあります。そのようなときは、BitConverter.GetBytes メソッドを利用するのが便利です。このメソッドは指定した値をバイト配列に変換してくれるため、その配列の長さ(Length プロパティ)を調べることで、変数のサイズを求めることができます。// sizeofを使わない方法 byte[] dataBytes = BitConverter.GetBytes(x); int d =