Shammer's Philosophy

My private adversaria

ポインタを堀り下げるその1

配列とポインタその2 - Shammerism以来になるが、またポインタを少しやる。というか、もうちょっと堀り下げていきたいと思う。ポインタも最初は簡単。しかし、どこかのタイミングでよくわからなくなる。それがどこなのかはよくわからないが。

変数に&をつけると、メモリアドレスを表すようになる、というのはポインタ以前からやっている。そして、実際にポインタを宣言するには変数の前に*をつけて変数を宣言する。*が付与された変数はメモリアドレスを格納するための変数、つまり、ポインタになる。以下、簡単な例。

#include <stdio.h>

main() {
    int a;
    int *aPtr;

    a = 7;
    aPtr = &a; // Set a's memory address to aPtr

    printf("a's address is %p.\n", &a);
    printf("aPtr value is %p.\n", aPtr);
    printf("a's value is %d.\n", a);
    printf("*aPtr value is %d.\n", *aPtr);
    printf("&*aPtr = %p.\n", &*aPtr);
    printf("*&aPtr = %p.\n", *&aPtr);

    return 0;
}

この例からは以下のことがわかる。

  • 変数に&をつけるとその変数のメモリアドレスになる
  • *と&は打ち消す
  • printf の %p は printf でどのように表記するかということを意味しているだけで、実際の変数の型とは関係ない。

また、以下のようにすると変数に値を代入できない。

&a = 8;

こうすると、以下のエラーが出た。

error: lvalue required as left operand of assignment

左辺は lvalue でないといけないらしい。lvalue って何かよくわからないけれど。この時点でよくわかっていないかも。。。