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
が配列の要素番号となっていることが理解できます。