为什么是局部变量指针?

时间:2015-05-28 04:58:09

标签: c

在这段代码中(摘自qemacs'源代码)

static int goto_char(u8 *buf, int pos, QECharset *charset)
{
    int nb_chars, c;
    u8 *buf_ptr;

    if (charset != &charset_utf8)
        return pos;

    nb_chars = 0;
    buf_ptr = buf;
    for(;;) {
        c = *buf_ptr;
        if (c < 0x80 || c >= 0xc0) {
            if (nb_chars >= pos)
                break;
            nb_chars++;
        }
        buf_ptr++;
    }
    return buf_ptr - buf;
}

为什么不直接访问buf而不是创建局部变量指针?

1 个答案:

答案 0 :(得分:3)

如果您增加buf,则会遗漏原始buf地址,从而导致长度跟踪。

有两个解决方案:保留原始变量的副本,使用另一个临时行走指针来增加buf指针或保留索引计数器。

这个实现使用了第二个。此外,有许多程序员不会改变函数参数以避免任何意外。

虽然您可以避免使用buf_ptr并使用buf[some_index++],但是当使用walking pointers代替索引时,一些古老的编译器可以生成更快的代码。

相关:What are convincing examples where pointer arithmetic is preferable to array subscripting?