- 使用指针遍历并求和
#include <stdio.h>
int main() {
int arr[10000];
// 假设数组已经初始化
for (int i = 0; i < 10000; i++) {
arr[i] = i;
}
int *ptr = arr;
int sum1 = 0;
for (int i = 0; i < 10000; i++) {
sum1 += *ptr++;
}
printf("使用指针遍历的和: %d\n", sum1);
return 0;
}
- 使用数组下标遍历并求和
#include <stdio.h>
int main() {
int arr[10000];
// 假设数组已经初始化
for (int i = 0; i < 10000; i++) {
arr[i] = i;
}
int sum2 = 0;
for (int i = 0; i < 10000; i++) {
sum2 += arr[i];
}
printf("使用数组下标遍历的和: %d\n", sum2);
return 0;
}
- 效率分析
理论上现代编译器对这两种方式的优化已经做得很好,在大多数情况下效率几乎相同。但从原理上来说,指针方式在某些情况下可能更优。原因是:
- 数组下标访问
arr[i]
,编译器实际上会将其转换为*(arr + i)
,即指针偏移的方式来访问内存。这意味着数组下标方式多了一步转换操作。
- 指针方式直接使用指针进行内存访问,在连续内存访问场景下,指针可以更好地利用CPU缓存,减少内存访问次数,提高缓存命中率。然而,现代编译器通常能够对数组下标方式进行同样有效的优化,使得两者在性能上的差异几乎可以忽略不计。