在这段代码中(摘自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而不是创建局部变量指针?
答案 0 :(得分:3)
如果您增加buf
,则会遗漏原始buf
地址,从而导致长度跟踪。
有两个解决方案:保留原始变量的副本,使用另一个临时行走指针来增加buf指针或保留索引计数器。
这个实现使用了第二个。此外,有许多程序员不会改变函数参数以避免任何意外。
虽然您可以避免使用buf_ptr
并使用buf[some_index++]
,但是当使用walking pointers
代替索引时,一些古老的编译器可以生成更快的代码。
相关:What are convincing examples where pointer arithmetic is preferable to array subscripting?