C++セミナー(初級)アドレスとポインタ

HOME->講習会->プログラミングセミナー->C++セミナー(初級)


データと型では,変数について紹介しました.では,変数はどのようにコンピュータでは扱われているのでしょうか.変数はコンピュータのメモリ(主記憶装置)で管理されます.C/C++では,ほかの言語では扱うことのできないアドレスを制御するための型としてポインタがあります.

目次

アドレス
ポインタ

アドレス

変数はメモリで管理されていると述べましたが,それではメモリとはなんでしょうか.メモリはコンピュータを構成する1つで,プログラムを動かすために一時的にデータを保持するための装置で,作業するときの机の広さに例えられることが多いです.ストレージ(HDDやSSDと呼ばれたりするもの)と勘違いされる方がたまにいらっしゃいますが,ストレージは単純にデータを保存するものです.ストレージとは異なるので注意しましょう.

プログラム上で変数を宣言すると,変数のサイズだけメモリに領域を確保します.例えば,char型の変数を宣言すれば,1 byteの領域をメモリに確保します.この確保した領域の位置情報をアドレスといいます.言い換えれば,変数の住所のようなものです.C/C++では,アドレスを制御することができ,表示したり変更したりすることができます.

それでは,実際に変数のアドレスを表示してみましょう.変数のアドレスを参照したい場合には,変数の前に「&」を付けることでアドレスを参照することができます.

#include <iostream>
int main()
{
    int i;
    std::cout << &i << std::endl;
}

上記のプログラムをコンパイルして,何回か実行してみてください.「0x7ffdfddaa3d4」というように16進数の数値の羅列が表示され,実行のたびに異なると思います.この数値の羅列がアドレスになります.これは,実行する際に,使用されていないアドレスから自動的に割り当てられるためです.

ポインタ

ポインタは,変数のアドレスを格納することができる変数です.ポインタ型,ポインタ変数と呼ばれることもあります.これまでに扱ってきた変数名の前に何も記号がついていない変数については,値型と呼ばれます.ポインタを使用するには,変数の宣言のときに変数名の前に「*」を付けることでポインタを宣言することができます.

変数型 *変数名;

例えば,int型のポインタを宣言したい場合には,以下のように宣言します.

int *p;

ポインタを使った例として,以下のプログラムを考えてみます.

#include <iostream>
int main()
{
    int a=10;  // int型変数
    int *p;    // int型のポインタ
    std::cout << "a: " << a << std::endl;
    p = &a;
    *p = 100;
    std::cout << "a: " << a << std::endl;
}

上記のプログラムを実行して,10と100が表示されればOKです.変数aの値を変更にしていないのに不思議に思われるかもしれません.これは,「p = &a;」でpにaのアドレスを格納させ,「*p=100;」でpに格納されているアドレスの中身を100に書き換えているためです.このように,変数名の前に「*」を付けることで行うことで,アドレスの中身を参照したり,変更することができます.

*ポインタ変数 = データ;  // ポインタ変数に格納しているアドレスにデータを格納する
変数 = *ポインタ変数;    // 変数にポインタ変数に格納しているアドレスのデータを格納する

今回の例ぐらいのものであれば,ポインタを用いる必要はないですが,この後に学ぶ配列や関数のときに重要になってくるので,ポインタの扱いについて覚えておきましょう.