C++入門:ポインタを使って配列の要素にアクセスする方法
ポインタとは、変数のメモリ上の位置(アドレス)を格納するための特殊な変数です。言い換えれば、ポインタは特定のメモリ位置を参照しており、そのメモリ位置に格納された値を取得することを「デリファレンス(間接参照)」と呼びます。
まずは、ポインタを使用して配列の単一の要素にアクセスする基本的なプログラムを見てみましょう。
例1:配列の1つの要素にアクセスする
#include <iostream>
using namespace std;
int main() {
int arr[5] = {5, 2, 9, 4, 1};
int *ptr = &arr[2];
cout<<"The value in the second index of the array is: "<< *ptr;
return 0;
}出力
The value in the second index of the array is: 9
このプログラムでは、ポインタptrに配列のインデックス2(値は9)の要素のアドレスが格納されています。これは次のコード部分で行っています。
int *ptr = &arr[2];
その後、間接演算子(*)を使ってポインタをデリファレンスすることで、値9が表示されます。該当するコードは以下の通りです。
cout<<"The value in the second index of the array is: "<< *ptr;
続いて、1つのポインタだけを使って配列のすべての要素に順番にアクセスするプログラムの例を紹介します。
例2:1つのポインタで配列の全要素にアクセスする
#include <iostream>
using namespace std;
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = &arr[0];
cout<<"The values in the array are: ";
for(int i = 0; i < 5; i++) {
cout<< *ptr <<" ";
ptr++;
}
return 0;
}出力
The values in the array are: 1 2 3 4 5
このプログラムでは、ポインタptrに配列の最初の要素(arr[0])のアドレスを格納しています。これは次のように記述します。
int *ptr = &arr[0];
その後、forループの中でポインタをデリファレンスしながら、配列内のすべての要素を順に出力しています。ポイントは、ループの各反復ごとにポインタをインクリメントしている点です。これにより、ポインタは反復のたびに配列の次の要素を指すようになり、その値が出力されます。該当するコードは以下の通りです。
for(int i = 0; i < 5; i++) {
cout<< *ptr <<" ";
ptr++;
}このように、ポインタとインクリメント演算子を組み合わせることで、添字を使わずに配列の全要素を効率的に走査できます。C++では配列名自体が先頭要素のアドレスを表すため、「int *ptr = arr;」のように書くことも可能です。
-
配列の全要素を乗算する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 解き方のアプローチ この問題は、累積用の一時変数を用意し、配列の要素を先頭
-
C#でポインターを使用して配列要素にアクセスするにはどうすればよいですか?
配列とポインターは同じ型ではないC#では、配列名と「配列と同じデータ型へのポインター」は、同じ変数型として扱われません。たとえば、int *p と int[] p は同一の型ではありません。ポインター変数 p はメモリ上に固定されていないため、インクリメント(アドレスを1つ進める)することが可能です。しかし、配列のアドレスはガベージコレクタによって移動される可能性があるため固定されており、直接インクリメントすることはできません。そこで、C#で配列をポインター経由で操作する場合は、fixed ステートメントを使用して、配列のアドレスを一時的に固定します。コード例以下は、fixed ステートメント