c语言数组及其下标引用,C语言之数组下标引用与间接引用

数组元素的访问方式有下标引用和间接访问两种.

除了优先级之外, 下标引用和间接访问完全相同. arrayname[subscript] = *(arrayname + (subscript))

例如:

int arrayname[10];

int *arrayptr = arrayname + 2;

arrayptr = arrayname+2 = &arrayname[2]

*arrayptr = arrayname[2] = *(arrayname+2)

arrayptr[0] = *(arrayptr+(0)) = arrayname[2] = *(arrayname+2)

arrayptr+6 = arrayname+8 = &arrayname[8]

*arrayptr+6 = *(arrayname+8)+6 = arrayname[2]+6

*(arrayptr+6) = *(arrayname+8) = arrayname[8]

arrayptr[6] = *(arrayptr+(6)) = *(arrayname+8) = arrayname[8]

arrayptr[-1] = *(arrayptr+(-1)) = *(arrayname+1) = arrayname[1]

2[arrayname] = *(2+(arrayname)) = *(arrayname+2) = arrayname[2]

如果可以互换的使用下标引用和间接(指针)引用, 那么应该选择哪一个呢?

通常考虑以下方面:

1. 下标访问更容易理解, 可读性更高.

2. 下标引用不会比指针引用更有效率, 但是有时指针会比下标更有效率.

考虑下面的循环:

// 使用下标

int arrayname[10], index;

for(index = 0; index < 10; index++)

arrayname[index]= 0;

在每次循环中, 程序获取index的值并于 sizeof(int) 相乘(因为数组指针的移动的间隔是sizeof(int)个内存单元). 这个乘法需要花费一定的时间和空间.

// 使用指针

int arrayname[10], *arrayptr;

for(arrayptr = arrayname; arrayptr < arrayname + 10; arrayptr++)

*arrayptr = 0;

上述代码中仍然存在乘法运算, 即 arrayptr++ 中, 1 * sizeof(int) 后与arrayptr相加. 但是注意到每次乘法都是 1 * sizeof(int) 所以编译器在编译时执行一次乘法后程序运行时就不再需要执行乘法, 程序中包含了数组指针与 1 * sizeof(int) 结果相加的指令.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值