配列とポインタ・アドレスのインクリメントを確認
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
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ずつインクリメントされていることを確認できます。
スポンサーリンク
- - 関連記事 -
- ツリー
- 二重リンクリスト
- リンクリストの指定した箇所に要素を追加
- リンクリスト
- delete演算子
- new演算子でオブジェクト生成
- new演算子・動的メモリの割り当て
- 構造体とポインタ
- 配列のポインタ宣言
- 定数ポインタ
- ポインタとは
スポンサーリンク