MST

星途 面试题库

面试题:C语言指针基础对程序效率影响之中等题

在C语言中,假设有一个大型数组`int arr[10000];`,分别使用指针和数组下标两种方式遍历该数组并计算所有元素之和,然后说明哪种方式理论上在效率上可能更优,并阐述原因。
38.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 使用指针遍历并求和
#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;
}
  1. 使用数组下标遍历并求和
#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;
}
  1. 效率分析 理论上现代编译器对这两种方式的优化已经做得很好,在大多数情况下效率几乎相同。但从原理上来说,指针方式在某些情况下可能更优。原因是:
  • 数组下标访问arr[i],编译器实际上会将其转换为*(arr + i),即指针偏移的方式来访问内存。这意味着数组下标方式多了一步转换操作。
  • 指针方式直接使用指针进行内存访问,在连续内存访问场景下,指针可以更好地利用CPU缓存,减少内存访问次数,提高缓存命中率。然而,现代编译器通常能够对数组下标方式进行同样有效的优化,使得两者在性能上的差异几乎可以忽略不计。