C中的组合解除引用和减少

Gar*_*ies 0 c performance pointers dereference decrement

我需要尽可能高效的方法来移动数组的内容.我需要将每个数组位置的内容向右移动并忽略第一个,这样我就可以在那里写一个新值.

这就是我所拥有的:

#define LENGTH 5

int myArray[LENGTH] = {1, 2, 3, 4, 5};

int *pa = myArray + (LENGTH - 1);

for (ushort i = 5; i > 0; i--) {
    *pa = *(pa - 1);
    pa--;
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是将for循环的两行组合成一个操作.就像是:

*pa = *(pa--);
Run Code Online (Sandbox Code Playgroud)

但是,结果是未定义的.我坚持使用我已经使用的东西吗?

编辑:我应该澄清这不是我正在使用的实际代码,只是一个快速的例子来演示我所追求的构造.

Jer*_*fin 6

如果你真的需要这样做,memmove可能会是你最好的选择.

但是,如果可能的话,最好完全避开它.不要移动当前内容以为新项目腾出空间,只需保持指向数组中"最旧"点的指针.当您需要添加新项目时,请执行类似的操作*new_pos++ = new_item;.

当你需要阅读你的数据时,你将从new_pos+1接下来的5个项目开始阅读,但每次增加你都会这样做% LENGTH,所以当你到达数组的末尾时,它会"绕回"到开头.


rus*_*lik 5

效率不是以行数来衡量的,因此您不会通过尝试以这种方式"压缩"代码来获得任何收益.

如果你删除最后一个元素,那么我的建议是使用循环缓冲区而不是数组,这样你根本不需要这个转换.元素访问的价格会略有增加,但是当LENGTH等于2的幂时,它将非常小.