您的位置 首页 IC

《C与指针》读书笔记七

在这本书中作者专门讨论了数组的下标和指针的关系。而且总结了一个结论:“假定两种方法都是正确的,下标绝对不会比指针更有效率,但指针有时会比下标更有效率。”这个问题我以前没有注

  在这本书中作者专门评论了数组的下标和指针的联系。并且总结了一个定论:“假定两种办法都是正确的,下标绝对不会比指针更有功率,但指针有时会比下标更有功率。”这个问题我曾经没有留意到过。并且作者从编译成果的视点证明自己的定论。

  int array[10] ,a;

  for( a =0 ;a < 10; a+=1 )

  array[a ] =0;

  这是一个数组的初始化,将整个数组初始化为0。array[a ]的定位办法比较特别,依照作者的意思是在核算array[a ]的地址时是arrary的值加上a乘于int的长度值得到的。所以每次数组元素的拜访都包括一次乘法运算。在根底数字电路中咱们知道加法器是比较简略完成的,乘法比较不太简略完成。并且乘法运算指令比加法运算指令周期要长。也便是作者以为下标拜访办法功率有进步的空间。

  int array[10] ,*ap;

  for( ap = array ;ap < array + 10; ap++ )

  *ap = 0;

  在for中每次循环只需将ap自增1即可。完全扔掉了乘法运算。进步了运算功率。可是假如根底比较单薄的程序员应该接纳不了此种写法,由于可读性显着下降。假如对程序时效和节能方面没有特别的要求,那么我主张仍是运用易读性强的编写办法。

  在书的146页作者介绍一系列优化办法。作者以为最优的仿制两个数组的办法如下:

  void try5( )

  {

  register int *p1, *p2;

  for( p1 = x, p2 = y; p1 < &x[SIZE]; )

  *p1++ = *p2++;

  }

  编译成终究代码十分简练。

  在该章节最终,作者专门介绍这样做实际意义。

  数组名作为参数传递函数时,也便是将数组的首个元素地址仿制给了函数的接纳参数。经过该参数能够对整个数组进行操作。

  作者再次举例完成了一个字符串仿制的函数。

  void strcpy( char *buffer, char const *string )

  {

  while(( *buffer++ = *string)!=’\0′)

  ;

  }

  完成字符串的仿制其实十分简略,我是第一次见到如此精粹的代码。

  数组初始化的确需求时刻,假如数组足够大,那么需求的时刻将比较可观。静态数组只初始化一次,可是主动变量却是函数每次履行都要从头初始化的。比方:

  static int arrary[5] = { 0, 1, 2, 3, 4 };

  int arrary[5] = { 0, 1, 2, 3, 4 };

  两种声明的差异十分显着。static int arrary[5]在函数履行之前就现已存在。 所以并不需求每次初始化。而int arrary[5]则需求函数每次履行时从头在栈中构建。假如每次都需求该数组,能够声明为静态。

  可是这样做应该也有坏处,便是堆中,并且一向存在。内存开支必定增大。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/115112.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部