今回は、ポインタの学習の前に「変数(オブジェクト)とアドレス」について理解を深めよう。
ご紹介するのは、変数(オブジェクト)のアドレスを表示するプログラムである。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.89.1)を使用して作成し、gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0でコンパイルしている。
変数(オブジェクト)とアドレス
変数=オブジェクトは、これまで、数値などを格納するためのバラバラの箱の様に考えてきた。
ところが、変数=オブジェクトは、記憶域(メモリ空間)の一部である。
![](https://i0.wp.com/my-studies.org/wp-content/uploads/2024/05/ddf5e8c111fa28155d5a612129a0fc3f.png?resize=580%2C768&ssl=1)
広大な空間に様々なオブジェクトが存在するので、それぞれの「場所」を何らかの方法で表す必要がある。場所を表すのが「番地」であり、アドレスと呼ばれる。
上図では、intオブジェクトnのアドレスが212で、intオブジェクトxのアドレスが216であることを表す。
それでは、オブジェクトのアドレスを調べてみよう。
オブジェクトのアドレスを表示するプログラム
//オブジェクトのアドレスを表示するプログラム
#include <stdio.h>
int main(void)
{
int n;
double x;
int a[3];
printf("nのアドレス:%p\n",&n);
printf("xのアドレス:%p\n",&x);
printf("a[0]のアドレス:%p\n",&a[0]);
printf("a[1]のアドレス:%p\n",&a[1]);
printf("a[2]のアドレス:%p\n",&a[2]);
return 0;
}
実行結果
nのアドレス:0x7fff2d0dd2fc
xのアドレス:0x7fff2d0dd300
a[0]のアドレス:0x7fff2d0dd30c
a[1]のアドレス:0x7fff2d0dd310
a[2]のアドレス:0x7fff2d0dd314
オペランドのアドレス取得に使っているのが、アドレス演算子と呼ばれる単項&演算子である。
単項&演算子 &a aのアドレス(aへのポインタを生成する)
![](https://i0.wp.com/my-studies.org/wp-content/uploads/2024/05/f65f192990335618be0d85bcb68ba10a.png?resize=984%2C1024&ssl=1)
本プログラムでは、変数nとxと配列aの全要素のアドレスを表示している。
表示されているアドレスは、16進数で表されている。(数値の直前に「0x」を付ける)
オブジェクトのアドレスは、アドレス演算子&で取り出せる。
(参考)新・明解C言語 入門編 第2版 柴田 望洋 (著)SBクリエイティブ
コメント