C++で使える意外な配列アクセス記法「index[配列名]」の仕組みを解説
配列(Array)は、同じデータ型の要素を連続的に格納する線形データ構造です。配列内の個々の要素にアクセスするには、通常、次のような標準的な記法が使われます。
標準的な構文
array_name[index];
コード例
#include <iostream>
using namespace std;
int main( ){
int arr[2] = {32,65};
printf("First Element = %d\n",arr[0]);
printf("Second Element = %d\n",arr[1]);
return 0;
}
実行結果
First Element = 32 Second Element = 65
実は、上記のコードとまったく同じ出力を得られる、もうひとつの記法が存在します。一見すると奇妙に見えますが、これは正式に有効なC++の構文です。
もうひとつの構文
index[array_name];
コード例
#include <iostream>
using namespace std;
int main( ){
int arr[2] = {32,65};
printf("First Element = %d\n",0[arr]);
printf("Second Element = %d\n",1[arr]);
return 0;
}
実行結果
First Element = 32 Second Element = 65
このように、0[arr] や 1[arr] という書き方でも、arr[0] や arr[1] と完全に同じ結果が得られます。では、なぜこのようなことが可能なのでしょうか。その理由を見ていきましょう。
なぜ両者は同じ動作をするのか
ポイントは、C++において添字演算子 [] がポインタ演算に変換されるという仕様にあります。
ケース1: arr[0] の場合
arr[0] は、内部的に *(arr + 0) として解釈されます。これは「配列名 arr が指すアドレスから0番目の要素」を意味します。
ケース2: 0[arr] の場合
0[arr] は、内部的に *(0 + arr) として解釈されます。
加算には交換法則が成り立つため、(arr + 0) と (0 + arr) はまったく同じ計算結果になります。つまり、どちらの書き方でも同じメモリアドレスを指すことになり、最終的に同じ値が取得されるのです。
まとめ
index[array_name] という記法は、コンパイラが添字演算をポインタの加算として処理するために成立しています。ただし、この書き方は可読性を大きく損なうため、実際の開発では標準的な array_name[index] を使うことが強く推奨されます。あくまで言語仕様の深い理解のための知識として覚えておくとよいでしょう。
-
C++で配列がビトニック配列かどうかを判定するプログラム
N個の整数からなる配列 arr[N] が与えられたとき、その配列がビトニック配列であるかどうかを判定するのが本記事のテーマです。ビトニック配列であれば「Yes its a bitonic array」と出力し、そうでなければ「No its not a bitonic array」と出力します。ビトニック配列とは、まず厳密に増加し、その後厳密に減少するような配列のことです。たとえば arr[] = {1, 2, 3, 4, 2, -1, -5} という配列は、4までは厳密に増加しており、4以降は厳密に減少しているため、ビトニック配列といえます。入力例と出力例入力arr[] = {1, 3, 5,
-
配列の全要素を乗算するC++プログラムの解説
整数型の要素を持つ配列が与えられたとき、配列内のすべての要素を掛け合わせ、その積を表示することを考えます。本記事では、この問題をC++(C言語スタイルのコード)で解く方法を、アプローチ、アルゴリズム、サンプルコード、実行結果まで順を追って解説します。 例 入力: arr[]={1,2,3,4,5,6,7} 出力: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 入力: arr[]={3, 4, 6, 2, 7, 8, 4} 出力: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 解き方のアプローチ この問題は、累積用の一時変数を用意し、配列の要素を先頭