配列とポインタ・アドレスのインクリメントを確認

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

C++では、ポインタの加算や減産など、ポインタを算術演算することが可能です。
ポインタは、メモリアドレスを保持する変数に過ぎないので、当たり前ですね。

スポンサーリンク

文字型の配列とポインタ

#include <iostream>
 
const int SIZE = 10;    // 配列中の文字数
char array[SIZE] = "abcdefg";    // 出力する配列
 
int main() {
    std::cout << array << "\n";
 
    // ポインタ設定
    char *array_ptr = &array[0];
    std::cout << array_ptr << "\n";    // array[0]のポインタ
    std::cout << *(array_ptr + 3) << "\n\n";    // array[3]の値と同じ
 
    std::cout << (array + 1) << "\n";
    std::cout << (array + 4) << "\n";
    std::cout << (array + 8) << "\n\n";
 
    int i;    // 配列のインデックス
    int size = sizeof(array)/sizeof(array[0]);    // 配列の要素数
 
    for (i = 0; i < size; i++) {
 
        std::cout << std::hex;    // 16進数で出力
        std::cout << i << " アドレス " << ": " << reinterpret_cast<int>(&array[i]) << ", ";
        std::cout << reinterpret_cast<int>(array + i) << " / ";
        std::cout << "データ(16, 10) " << ": " << static_cast<int>(array[i]) << ", ";
 
        std::cout << std::dec;    // 10進数に戻す
        std::cout << array[i];
 
        std::cout << "\n";
    }
 
    return 0;
}

実行結果。

abcdefg
abcdefg
d
 
bcdefg
efg
 
 
0 アドレス : 412004, 412004 / データ(16, 10) : 61, a
1 アドレス : 412005, 412005 / データ(16, 10) : 62, b
2 アドレス : 412006, 412006 / データ(16, 10) : 63, c
3 アドレス : 412007, 412007 / データ(16, 10) : 64, d
4 アドレス : 412008, 412008 / データ(16, 10) : 65, e
5 アドレス : 412009, 412009 / データ(16, 10) : 66, f
6 アドレス : 41200a, 41200a / データ(16, 10) : 67, g
7 アドレス : 41200b, 41200b / データ(16, 10) : 0, 

文字型で実験したので、アドレスを確認するためには16進数へとキャストして確認しています。
&array[i] (メモリアドレス)が「1」ずつ増加していることを確認できます。
文字は1倍とですので、char型の配列には、1文字ごとに1つずつインクリメントされたアドレスが割り当てられます。

int型の配列とポインタ

int型の配列の場合も確認してみます。

#include <iostream>
 
const int SIZE = 10;    // 配列中の文字数
int array[SIZE] = {1, 2, 3, 4, 5, 6};    // 出力する配列
 
int main() {
    int i;    // 配列のインデックス
    int size = sizeof(array)/sizeof(array[0]);    // 配列の要素数
 
    for (i = 0; i < size; i++) {
        std::cout << i << "アドレス " << ": " << (&array[i]) << ", ";
        std::cout << (array + i) << " / ";
        std::cout << "データ" << ": " << array[i];
 
        std::cout << "\n";
    }
 
    return 0;
}

実行結果。

0アドレス : 00412004, 00412004 / データ: 1
1アドレス : 00412008, 00412008 / データ: 2
2アドレス : 0041200C, 0041200C / データ: 3
3アドレス : 00412010, 00412010 / データ: 4
4アドレス : 00412014, 00412014 / データ: 5
5アドレス : 00412018, 00412018 / データ: 6
6アドレス : 0041201C, 0041201C / データ: 0
7アドレス : 00412020, 00412020 / データ: 0
8アドレス : 00412024, 00412024 / データ: 0
9アドレス : 00412028, 00412028 / データ: 0

int型のデータは、4バイトとして、メモリアドレスが4ずつインクリメントされていることを確認できます。

スポンサーリンク
 
スポンサーリンク