ポインタ演算 – その1

今日は、ポインタに数字を足すよ!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
int main(int argc, char *argv[])
{
    char *pInt08 = (char *)0;
    short *pInt16 = (short *)0;
    int *pInt32 = (int *)0;
    long *pInt64 = (long *)0;
 
    printf( "sizeof(char) = %lu\n", sizeof(char) );
    printf( "pint08 = %2lu\n", (unsigned long)(pInt08 + 0) );
    printf( "pint08 = %2lu\n", (unsigned long)(pInt08 + 1) );
    printf( "pint08 = %2lu\n", (unsigned long)(pInt08 + 2) );
 
    printf( "sizeof(short) = %lu\n", sizeof(short) );
    printf( "pint16 = %2lu\n", (unsigned long)(pInt16 + 0) );
    printf( "pint16 = %2lu\n", (unsigned long)(pInt16 + 1) );
    printf( "pint16 = %2lu\n", (unsigned long)(pInt16 + 2) );
 
    printf( "sizeof(int) = %lu\n", sizeof(int) );
    printf( "pint32 = %2lu\n", (unsigned long)(pInt32 + 0) );
    printf( "pint32 = %2lu\n", (unsigned long)(pInt32 + 1) );
    printf( "pint32 = %2lu\n", (unsigned long)(pInt32 + 2) );
 
    printf( "sizeof(long) = %lu\n", sizeof(long) );
    printf( "pint64 = %2lu\n", (unsigned long)(pInt64 + 0) );
    printf( "pint64 = %2lu\n", (unsigned long)(pInt64 + 1) );
    printf( "pint64 = %2lu\n", (unsigned long)(pInt64 + 2) );
    return 0;
}

実行結果
sizeof(char) = 1
pint08 = 0
pint08 = 1
pint08 = 2
sizeof(short) = 2
pint16 = 0
pint16 = 2
pint16 = 4
sizeof(int) = 4
pint32 = 0
pint32 = 4
pint32 = 8
sizeof(long) = 8
pint64 = 0
pint64 = 8
pint64 = 16

今日から入れ物を変数って呼ぶよ。
変数にはいくつかの大きさがって、
大きさごとに名前が付いてるけど、それを型と呼んでいるよ。
もちろん、ポインタにも大きさがあるよ。
でも、型と、その大きさはプラットフォーム依存だから、
今回と違う結果が得られる環境が存在するよ。

ポインタが配列のように扱えるのは、こないだやったばかりだね。
配列は、変数を連続して並べたものだけど、
型が違うと次の変数があるアドレスまでの大きさも違ってくるよね。
でも、そこはCコンパイラさんが、ポインタの型に応じて、
さりげなく対処してくれてるよ。
つまり、どの大きさの変数のポインタかによって、
+1や+2の意味は変わってくるよ。

今日も、Cコンパイラさんのさりげないやさしさを垣間見れたね。

Leave a Comment