《C和指针》中关于指针与下标的问题

tanchb 2016-06-21 09:53:04
问题位于 8.13 指针与下标 小节中

原文:

假定这两种方法都是正确的,下标绝不会比指针更有效率,但指针有时会比下标更有效率。
为了理解这个效率问题,让我们来研究两个循环,它们用于执行相同的任务。首先,我们使用下标方案将数组中的所有元素都设置为0。
int array[10], a;
for( a = 0; a < 10; a += 1 )
array[a] = 0;
为了对下标表达式求值,编译器在程序中插入指令,取得a的值,并把它与整型的长度(也就是4)相乘。这个乘法需要花费一定的时间和空间。

问题:

红字部分就是我的疑问,为什么要用a的值和整型的长度相乘,乘出来的又是什么,有些没看懂,感谢各路高手帮忙解答
...全文
146 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灸舞 版主 2016-06-21
  • 打赏
  • 举报
回复
int array[10], 说明数组元素为整形。 取得a的值,并把它与整形的长度(也就是4)相乘,就是根据下标a,乘以4(整形量所占内存的字节数),所得结果就是下标变量相对数组起始位置的偏移,也就是array[a]所对应的“变量地址”(当然要加上数组基址)

int array[10], a;
for(a = 0; a < 10; a += 1)
     array[a] = 0;
为了对下标表达式求值,编译器在程序中插入指令,取得a的值,并把它与整形的长度(也就是4)相乘。这个乘法需要花费一定的时间和空间。

int array[10], *ap;
for(ap = array; ap < array + 10; ap++)
     *ap = 0;	
ap++中,++其实就是在ap当前指针所指的位置处,加上一个ap所指元素的类型的长度,这里就是int,即4。也就是1必须与整形的长度(也就是4)相乘,然后再与指针相加。 从这里,貌似两个循环都进行了乘法,好像没有什么差异。可是,你注意到没有2个循环其实是有很大的不同的。不同在哪里呢??? 仔细看,会发现数组下标中的a每次的值是不同的,每次a都会与长度4进行相乘,即进行了10次乘法。 再看看指针,你会发现ap++时,是1与长度4进行相乘,再与指针相加。每次执行乘法时,其实就是1*4。这个乘法只在编译时进行了一次运算。程序执行的时候,就没有进行乘法运算,只是简单的将4与指针相加而已。 指针比下标更有效率的一个典型。你会发现在这个场合中 -- 当你在数组中1次1步(或某个固定的数字)地移动时,与固定数字相乘的运算在编译时完成,所以运行时所需的指令就少一些。在绝大多数机器上,程序竟会更小一些、更快一些。
fefe82 2016-06-21
  • 打赏
  • 举报
回复
请忽略以上的叙述。(可以忽略以上有关效率的所有文字) 随着 CPU 、体系结构 与 编译器的发展,以上说法的正确性在随时发生着变化。

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧