【问题标题】:Pointer Arithmetic In CC中的指针算术
【发布时间】:2010-10-20 01:38:09
【问题描述】:

考虑以下代码片段:

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

q = p;
q++;
printf("%d, %d\n", q, p);
printf("%d\n", q-p);

我知道指针算法是智能的,这意味着操作 q++ 前进了 q 足够的字节指向下一个 3 整数数组,所以我并不惊讶第一次打印是 '@987654324 @' 这意味着增加 q 使其在 12 中变大。

但第二次打印确实让我感到惊讶。它打印 1!
那么为什么它会打印 1 而不是 12?这让我很困惑。

【问题讨论】:

    标签: c pointers pointer-arithmetic


    【解决方案1】:

    如果您真的想知道差异,请将每个指针转换为 (char*),然后转换为 (int),然后再减去。那应该会给你答案。

    此代码为您提供绝对值:

    printf("%d\n", abs((int)((char*)q) - (int)((char*)p)));
    

    记得包含 math.h。

    编辑: 正如评论中指出的那样,我们不需要双重演员。将每个指针指针转换为一个 int 然后减去,给出的答案与上面的(不必要的)双重转换相同。

    printf("%d\n", abs((int)(q) - (int)(p)));
    

    【讨论】:

    • 如果 sizeof(int)
    【解决方案2】:

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

    【讨论】:

    • 那么没有办法获取两个指针并得到它们的字节差?
    • 将指针转换为 (char *) 然后你会得到字节的差异。
    • @Leif:或者只是将差值乘以 sizeof(your_type)。
    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 2013-06-03
    • 2020-12-17
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多