TOP - C言語 - ポインタ - 演算

ポインタの演算は次のような結果となります。

・単項演算子*を伴う場合
ポインタの指すオブジェクトの値に関する演算結果

・単項演算子*を伴わない場合
ポインタに格納されるアドレス自体の演算結果

(例)
#include <stdio.h>

int main ()
{
    int *p1;
    double *p2;
    char *p3;
    
    int i = 1;
    double d = 2.0;
    char c = 3;
    
    p1 = &i;
    p2 = &d;
    p3 = &c;

    printf("演算前 *p1 : %d\n", *p1);
    printf("演算前 *p2 : %3.1f\n", *p2);
    printf("演算前 *p3 : %d\n\n", *p3);

    *p1 = *p1 + 3;                  // 単項演算子*を伴う演算
    ++*p2;
    *p3 = *p3 + '0';

    printf("演算後 *p1 : %d\n", *p1);
    printf("演算後 *p2 : %3.1f\n", *p2);
    printf("演算後 *p3 : %d\n\n", *p3);
    
    printf("演算前アドレス p1 : %p\n", p1);
    printf("演算前アドレス p2 : %p\n", p2);
    printf("演算前アドレス p3 : %p\n\n", p3);

    p1++;                           // 単項演算子*を伴わない演算
    p2++;
    p3++;

    printf("演算後アドレス p1 : %p\n", p1);
    printf("演算後アドレス p2 : %p\n", p2);
    printf("演算後アドレス p3 : %p\n\n", p3);

    printf("アドレス演算後 *p1 : %d\n", *p1);
    printf("アドレス演算後 *p2 : %3.1f\n", *p2);
    printf("アドレス演算後 *p3 : %d\n", *p3);

    return 0;
}

実行結果
演算前 *p1 : 1
演算前 *p2 : 2.0
演算前 *p3 : 3

演算後 *p1 : 4
演算後 *p2 : 3.0
演算後 *p3 : 51

演算前アドレス p1 : 0x7fff5fbff828
演算前アドレス p2 : 0x7fff5fbff808
演算前アドレス p3 : 0x7fff5fbff82f

演算後アドレス p1 : 0x7fff5fbff82c            <- 4バイト増加
演算後アドレス p2 : 0x7fff5fbff810            <- 8バイト増加
演算後アドレス p3 : 0x7fff5fbff830            <- 1バイト増加

アドレス演算後 *p1 : 855670783                <- 不定値
アドレス演算後 *p2 : 0.0                      <- 不定値
アドレス演算後 *p3 : 64                       <- 不定値


Copyright(C) 2006-2012 CLAYPOT. All Rights Reserved.