C++ ポインタ vs 配列

C++ ポインタ

ポインタと配列は密接に関連しています。実際、ポインタと配列は多くの場合において互換性があります。例えば、配列の先頭を指すポインタは、ポインタの算術演算や配列インデックスを使用して配列にアクセスできます。次のプログラムを見てください:

サンプル

#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // ポインタにおける配列のアドレス ptr = var; for (int i = 0; i < MAX; i++) { cout << "var[" << i << "]のメモリアドレスは"; cout << ptr << endl; cout << "var[" << i << "] の値は"; cout << *ptr << endl; // 次の位置に移動する ptr++; } return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が生成されます:

var[0]的内存地址为 0x7fff59707adc
var[0] 的值为 10
var[1]的内存地址为 0x7fff59707ae0
var[1] 的值为 100
var[2]的内存地址为 0x7fff59707ae4
var[2] 的值为 200

ただし、ポインタと配列は完全に交換可能というわけではありません。例えば、次のプログラムを見てください:

サンプル

#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; for (int i = 0; i < MAX; i++) { *var = i; // これは正しい構文です var++; // これは正しくありません } return 0; }

ポインタ演算子 * を var に適用することは完全に可能ですが、var の値を変更することは不正です。これは、var が配列の先頭を指す定数であり、左辺値として使用できないためです。

配列名はポインタ定数に対応するため、配列の値を変更しない限り、ポインタ形式の式を引き続き使用できます。例えば、以下の文は有効で、var

*(var + 2) = 500;

上記の文は有効であり、var が変更されていないため、正常にコンパイルできます。

C++ ポインタ

その他の拡張