演習課題「配列の各要素のアドレスを表示させる」
data 配列の各要素のアドレスを改行区切りで出力してください。
プログラムを実行して、正しく結果が表示されれば、演習課題クリアです!
期待する出力値
0x7ffeea7e0a80
0x7ffeea7e0a84
0x7ffeea7e0a88
0x7ffeea7e0a8c
0x7ffeea7e0a90
0x7ffeea7e0a94
0x7ffeea7e0a98
0x7ffeea7e0a9c
0x7ffeea7e0aa0
0x7ffeea7e0aa4
#04:ポインタの値を見てみよう
ポインタの値を表示させます。そして、ポインタについて理解を深めましょう。
#include <stdio.h>
int main(void)
{
int data[] = {1, 2, 3, 4, 5};
int *p1;
p1 = &data[2];
*p1 = 30;
}
p1 変数に data 配列のインデックス 2 のアドレスが代入されて、
*p1 = 30; でその値が 30 に書き換えられます。
アドレスの値を表示するには、printf の変換指定子に %p を使います。#include <stdio.h>
int main(void)
{
int x;
// x 変数のアドレスを表示する
printf("%p\n", &x);
}
ポインタ型の変数を扱うときに混同しやすいのが、
「変数に代入されたアドレス」と「変数の本体のアドレス」です。#include <stdio.h>
int main(void)
{
int x;
int *y;
y = &x; // y 変数に x 変数のアドレスを代入
printf("y : %p\n", y);
printf("&y : %p\n", &y);
}
上のプログラムを実行したとき、
・ y の値は、x 変数のアドレスになっていますが、
・ &y の値は、y 変数そのもののアドレスなので、この値は x 変数とは直接関係ありません。
printf に変換指定子で %p を使ったときに表示されるアドレスの値は 16 進数になっています。
16 進法では通常の 0 から 9 までの数字に加えて、
アルファベットの a b c d e f
をそれぞれ
10 11 12 13 14 15
と見なして、各桁を 16 個の数字で表します。
16 進数であることをわかるようにするために、数値の前には「0x」をつけることが多いです。
たとえば、「0x10」は 16 を表します。
このチャプターで作成したコードです。// ポインタの値を見てみよう
#include <stdio.h>
int main(void)
{
int data[] = {1, 2, 3, 4, 5};
int *p1;
p1 = &data[2];
printf("p1 : %p\n", p1);
printf("&p1 : %p\n", &p1);
*p1 = 30;
for (int i = 0; i < 5; i++) {
printf("&data[%d] : %p\n", i, &data[i]);
}
}
- IT 専科 - C 言語入門 ポインタ
http://www.itsenka.com/contents/development/c/pointer.html
- 初心者のためのポイント学習 C 言語 - ポインタ
http://www9.plala.or.jp/sgwr-t/c/sec10.html