C言語のポインタ変数に四則演算する場合の注意事項

C言語のポインタ変数に四則演算する場合の注意事項はポインタ変数に1を加算しても実際は変数の型の座サイズ分ずれます。

次の変数の先頭を見つけると考えれば理解できますが、これは非常に重要なのでよく理解しておきましょう。

文章で書くと「何のこと?」ってなりますが、ポインタ変数をしっかり理解していると、当たり前なのですけどね。

スポンサーリンク

ポインタ変数の四則演算

C言語のポインタ変数は他の変数と同様に四則演算を行えます。

四則(しそく)あるいは四則演算と称するとは加算 (addition)、減算 (subtraction)、乗算 (multiplication)、除算 (division) の4つの演算のこと。

つまり、値を足したり引いたり、掛けたり割ったりできます。

    int *adr_int ;
    int i = 100 ;

    adr_int = &i ;    //iのアドレスをポインタ変数にセット
    adr_int++ ;       //ポインタ変数に+1する

のような使い方ができます。

+1するとiという変数が確保されているメモリの次の変数(ここでは未定義なので通称「ゴミ(中身未定義)」)を見ることができます。

ポインタ変数の四則演算の注意ポイント

実はこのポインタ変数の四則演算で1つだけ注意しておくことがあります。

それは四則演算で移動するポインターのバイト数は、その確保さている変数のバイト数に依存します。

例えばchar型のポインタ変数に+1するとchar型は1バイトなのでポインタ変数内のアドレスは+1されますが、int型のポインタ変数に+1すると変数内のアドレスは+4されます。
(int型の変数を4バイトとして扱う処理系の場合。)

実際の動作結果は

#include   <stdio.h>
int    main( int argc, char **argv )
{
    char    *char_adr ;
    char    c = 'A' ;
    int     *int_adr ;
    int     i = 100 ;

    char_adr = &c ;
    int_adr = &i ;

    printf( "char_adr=[%ld]--->+1すると[%ld]n", char_adr, char_adr + 1 ) ;
    printf( "int_adr =[%ld]--->+1すると[%ld]n", int_adr, int_adr + 1 ) ;

    return 0 ;
}

とchar型のポインタ変数とint型のポインタ変数にそれぞれ+1するプログラムを動作させると

char_adr=[6422079]--->+1すると[6422080]
int_adr =[6422072]--->+1すると[6422076]

char型は1加算されるのに対してint型は4加算されています

理由は簡単で、メモリ上の変数のアドレスを扱うのですから、その型の次の変数は?と言われると、その変数の型のバイト数分進まないと次が見れないからです。

まとめ

ポインタ変数の四則演算の注意ポイントを忘れるとCASTをしたがために思わないアドレスを指し示したり、デバッグでその不具合が見つけにくかったろ不都合が出できます。

ポインタ変数を扱うときは頭の中にメモリ空間を思い浮かべて四則演算をすると間違うことが減りますので、ぜひその癖をつけてください。

以上、C言語のポインタ変数に四則演算する場合の注意事項でした。

タイトルとURLをコピーしました