数组下标赋值和指针赋值效率探索

本文探讨了在C语言中,使用数组下标与指针赋值两种方式对数组进行初始化时的效率差异。实验结果显示,指针赋值方式通常比下标赋值更快,原因在于指针仅需在编译时执行一次乘法操作,而下标赋值在每次循环中都需要计算。然而,实际编程中,代码的可读性和维护性往往比效率更重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用数组下标赋值和指针赋值效率探索

int main(int argc, char **argv)
{
    int arr[100]; 
    int *p;
    struct timespec beg, end;

    clock_gettime(CLOCK_REALTIME, &beg);

    //使用下标赋值
    /* for(int i = 0; i < 100; i++){ */
    /*     arr[i] = 0; */
    /* } */

    //使用指针赋值
    for(p = arr; p < arr; p++){
        *p = 0;
    }
    
    clock_gettime(CLOCK_REALTIME, &end);

    printf("cost time = %ld\n", end.tv_nsec - beg.tv_nsec);

    return 0;
}

上面的代码是两种非常常用的数组循环赋值的写法,貌似使用下标赋值的方式可能更容易理解,更加常见。但是这两种写法真的就一样么?

  1. 但从功能上来说的确是一摸一样,但是从效率上来看,效率一样么?经过实际测试发现,指针的方式效率要更高,而且高很多!

    1. 使用下标的运行时间(纳秒)
      在这里插入图片描述

    2. 使用指针的运行时间(纳秒)
      在这里插入图片描述

  2. 为什么指针的方式效率会更高呢?

    1. 对于采用下标的时候:为了对下标表达式求值,编译器在程序中插入指令,获取到i值,并且把它与整型的长度(4)相乘,因为i值不是固定的所以,每次一for循环都需要做乘法,需要花费一定的时间和空间。
    2. 采用指针的方式的时候:这里的for循环也需要乘法,即1乘整型的长度(1*4),然后再与指针相加。这与下标的乘不同,执行乘法运算的时候,每次都是两个相同的数(1和4)。结果这个乘法只在编译的时候执行一次,所以现在执行指针偏移的时候就只包含了一条指令,即4与指针相加。程序在运行时并不执行乘法运算。(参考书籍《c和指针》)
  3. 指针并不一定比数组更有效率,有时指针运用的比较差(代码编写比较差),可能会导致使用指针的方式比直接使用简洁易懂的下标效率更低。

  4. 实际编程中代码的效率并不是唯一所追求的,有时代码写的简洁、通俗易懂更为重要

### 数组赋值与取值方法 在编程中,数组是一种常见的数据结构,用于存储一组相同类型的元素。以下是关于如何对数组进行赋值取值的具体说明。 #### C语言中的数组赋值与取值 在C语言中,可以通过多种方式实现数组赋值取值操作。最常用的方式是通过索引来访问数组中的特定位置并对其进行读写操作[^1]: ```c int main() { int arr[5] = { 1, 2, 3, 4, 5 }; // 初始化数组 int ret = arr[2]; // 使用下标访问第3个元素 (注意:索引从0开始) printf("%d\n", ret); // 输出结果为3 return 0; } ``` 上述代码展示了如何初始化一个整型数组 `arr` 并通过其索引 `[2]` 获取第三个元素的值。这种基于索引的操作简单直观,在实际开发中被广泛采用。 除了直接使用方括号语法外,还可以利用指针间接完成类似的解引用过程。例如: ```c int *ptr = &arr[0]; printf("%d\n", *(ptr + 2)); // 同样输出的是第三位数值 '3' ``` 这里定义了一个指向第一个元素地址的指针变量 `*ptr` ,并通过偏移量计算目标位置的内容。 #### JavaScript中的数组赋值与取值 对于JavaScript而言,由于它是动态弱类型的语言特性决定了它处理数组时更加灵活多变。同样可以借助索引机制快速定位到指定项上执行相应动作;不过值得注意的一点在于当涉及到复杂的数据结构像对象或者嵌套列表等情况之下,则可能需要额外考虑深浅复制等问题以免造成意外修改原始资料的情况发生[^2]: ```javascript let jsArr = [6,7,8,9,10]; // 创建一个新的JS Array实例 console.log(jsArr[1]); // 访问第二个成员得到'7' // 修改某个具体单元格内的储存项目 jsArr[3]=99; // 将原来位于第四处的位置更新成新的数字99 console.log(jsArr); ``` 另外如果遇到更复杂的场景比如说想要克隆整个集合而不是仅仅只是单纯传递链接过去的话那么就需要运用专门的技术手段来进行深层次拷贝了。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值