なぜ C/C++ では a[i] と i[a] が同じ動作をするのか?
C/C++ には、あまり知られていない興味深い言語仕様があります。配列の要素へアクセスする際の添字表記 A[i] は、実は i[A] と書き換えてもまったく同じように動作するのです。一見不思議に思えますが、これには明確な理由があります。
なぜ a[i] と i[a] が同じになるのか
C/C++ の規格では、添字演算子 E1[E2] は *((E1) + (E2)) として定義されています。つまり、コンパイラは内部的にポインタ演算を行うことで配列要素へアクセスしているのです。
二項演算子 + に適用される型変換の規則により、E1 が配列オブジェクトで E2 が整数である場合、E1[E2] は配列 E1 の E2 番目の要素を意味します。これは A[B] を *(A + B) と定義できることを示しています。同様に、B[A] は *(B + A) となります。
加算は可換(順序を入れ替えても結果が変わらない)であるため、*(A + B) と *(B + A) は本質的に同じ式ということになります。これが A[i] と i[A] が同一の動作をする理由です。
サンプルコード
#include <iostream>
using namespace std;
int main() {
int array[] = {1, 2, 3, 4, 5, 6, 7};
cout << "array[5] is " << array[5] << endl;
cout << "5[array] is " << 5[array];
}
出力結果
array[5] is 6 5[array] is 6
実務での注意点
5[array] のような書き方は規格上正しくコンパイル・実行できますが、可読性を大きく損なうため、実際の開発では使用しないことをおすすめします。この挙動は「配列の添字アクセスがポインタ演算の糖衣構文にすぎない」という C/C++ の設計思想を理解するための、良い学習材料だと言えるでしょう。
-
【初心者向け】C/C++における多次元配列の初期化方法をわかりやすく解説
多次元配列とは、次元数が2以上ある配列のことです。本記事では、3×3×3の多次元配列におけるメモリ割り当ての仕組みと、実際に配列を初期化して内容を表示するC++プログラムを紹介します。下図は、次元が3×3×3の多次元配列に対するメモリ割り当ての戦略を示したものです。アルゴリズム多次元配列を初期化するプログラムは、以下の手順で構成されます。Begin 多次元配列の要素を初期化する 配列のサイズを出力する 配列の内容を表示する Endサンプルコード以下は、2行2列の二次元配列を初期化し、そのサイズと内容を出力するC++プログラムです。#include<iostream
-
C++で配列を使う方法!宣言から要素へのアクセスまで徹底解説
配列(Array)とは、同じ型の要素が連続したメモリ領域上に並んでいるデータ構造で、一意の識別子(変数名)にインデックスを組み合わせることで、個々の要素に個別にアクセスできます。C++で配列を使用するには、まず配列を宣言する必要があります。 int arr[10]; このコードは、int型の要素を10個格納できる配列を宣言しています。これにより、連続したメモリ領域に10個の整数を保存することが可能になります。 配列の要素へアクセスする方法 配列の特定の要素を参照するには、配列アクセス演算子「[]」を使い、アクセスしたい要素のインデックスを指定します。ここで重要なのは、C++の配列のインデックス