法大奥山研究室

 previous  contents

10.5. ポインタを含む減算演算と ptrdiff_t 型変数


 ポインタを含む減算演算には,次のルールがあります。[C99, 6.5.6, 3]

但し,ポインタ間の差は,ライブラリ stddef.h で定義された ptrdiff_t型変数となります。ポインタ間の差はそれら2つのポインタが同一の配列を指し示す場合に許されたもので,その結果はその配列上の要素番号の差になります。[C99, 6.5.6, 9]

/* Example 10.8 */

#include <stdio.h>

int main(void)
{
       char str[] = "ABCDEFG";
       char *p;
       for(p = str; *p != '\0'; p++)
              printf("str[%td] '%c' %x [%p]\n", p - str, *p, *p, p);
       return 0;
}

* 仕様(C99)では,ptrdiff_t型の出力には t を付すとなっています。[C99, 7.19.6.1]
[例]%td%to

これは,Example 10.7 において,ポインタ同士の減算を利用して,配列の要素番号を出力させたものです。実行結果です。

str[0] 'A' 41 [0xbffffa98]
str[1] 'B' 42 [0xbffffa99]
str[2] 'C' 43 [0xbffffa9a]
str[3] 'D' 44 [0xbffffa9b]
str[4] 'E' 45 [0xbffffa9c]
str[5] 'F' 46 [0xbffffa9d]
str[6] 'G' 47 [0xbffffa9e]

ポインタ同士の差(減算式)p - str が配列の要素番号となっていることが理解できます。


 previous  contents