C语言中的指针算法

Ori*_*ski 12 c pointers pointer-arithmetic

请考虑以下代码片段:

int (*p)[3];
int (*q)[3];

q = p;
q++;
printf("%d, %d\n", q, p);
printf("%d\n", q-p);
Run Code Online (Sandbox Code Playgroud)

我知道指针算法是智能的,这意味着操作q++前进q足够的字节指向下一个3整数数组,所以第一次打印是' 12, 0' 并不意味着递增q使它在12中更大.

但第二次印刷确实令我惊讶.它打印1!
那么为什么它会打印1而不是12?它只是困惑我.

Gre*_*ill 27

++增量运算符一样,-带指针的减法运算符也会考虑指向的对象的大小.具体来说,返回的结果是指针值中的字节数差异除以指向对象的大小(在您的示例中为12).所以差异是12个字节,除以12或1.

  • 将指针转换为(char*),然后你将获得字节差异. (8认同)
  • @Leif:或者只是将差异乘以sizeof(your_type). (4认同)