変数のアドレスについて

最終更新日:2004-06-26.

今回は、変数のアドレスについてちょっと。
ポインタを使用する場合には必須ですね。

・変数のアドレスについて。

変数を使用するには、変数の型と名前を宣言します。
すると、メモリ上のどこかにその変数のための領域が確保されます。
そして、その変数に値を代入したり、格納されている値を
読みとることができます。

また、ポインタは任意の変数のアドレスを格納するための変数です。
そして、ポインタ変数を宣言した場合もメモリ上のどこかに
これに対応した領域が確保されます。

変数のアドレスを知るには、変数名の前に & 記号を付けます。

例えば、int型の変数iとポインタ*pがあるとします。

int i;
int *p;

変数iのアドレスは &i で表します。

i=1;
p=&i;

上記は、変数iに1を代入しています。
そして、ポインタpに &i (iのアドレス)を代入しています。

このとき、*pは変数iに代入されている値になります。

また、 &p とすると、ポインタ変数p自信のアドレスを知ることが
できます。

次に、文字型配列sとポインタ*qがあるとします。

char s[7]="sunday";
char *q=&s[0];

上記、文字型配列sにはsundayが、qには文字型配列s[0]のアドレス&s[0]
が代入されています。

このような場合、ポインタqの値をq++やq--などのように変化させると
格納されている文字型配列のアドレスを変化させることができます。

このようにすると、文字列をなぞることなどもできます。

配列を使用しているとき、ポインタを使用して操作することも
よくあるでしょう。
ポインタが記憶しているのはそれと関係のある変数のアドレスです。

また、関数間でデータの受け渡しをする際、
変数の値を使用する場合もありますが、変数のアドレスを
用いることもあります。

では、ソースにしてみましょう。
+------------------------------------------------------------+
/* filename=no022-1.c */
/* include */
#include <stdio.h>
/* 関数プロトタイプ宣言 */
void sub(char *, int *, long *, double *, char *);
/* main */
int main( )
{
char c;
int i;
long l;
double d;
char word[1024];
printf("char, int, long, double, char型配列を宣言。\n");
printf("sizeof c=%d, i=%d, l=%d, d=%d, word=%d\n",
sizeof(c), sizeof(i), sizeof(l), sizeof(d), sizeof(word));
sub(&c, &i, &l, &d, &word[0]);
return 0;/* 終了 */
}
/* address表示 */
void sub(char *cp, int *ip, long *lp, double *dp, char *wp)
{
printf("address cp=%d, ip=%d, lp=%d, dp=%d, wp=%d\n",
cp, ip, lp, dp, wp);
return;/* 戻る */
}
+------------------------------------------------------------+

上記をコンパイルして実行すると、以下のように表示されました。
char, int, long, double, char型配列を宣言。
sizeof c=1, i=2, l=4, d=8, word=1024
address cp=3001, ip=2999, lp=2995, dp=2987, wp=3002

戻る