欢迎来到学术参考网

C语言指针的研究和探讨

发布时间:2015-12-14 13:52

摘 要:指针是C语言的精华部分,也是C语言学习的重点和难点,正确而灵活地应用指针是学习C语言中最重要的环节,也是我们掌握C语言的一个标志。理解和运用好指针可以灵活方便地处理程序中各种复杂问题,可以轻松完成其他高级程序设计语言不便完成的任务。在某些场合,指针是使运算得以解决的唯一途径,同时正确而灵活的掌握运用它,可以提高程序的运行速度,从而有效地表示和实现复杂数据结构。

关键词:C语言;指针;程序设计;变量;标识符
  C语言在处理变量、数组、函数时,需要由操作系统把这些数据调入内存的不同存储单元中,每个内存单元都对应着一个地址,计算机就是通过访问这个地址来存取对应单元的内容。C语言中的每种数据类型在内存中存放所占用的存储单元数是固定的。从而根据数据的第一个存储单元地址(首地址)及数据类型,计算机就可以访问这个数据。C语言声明一个变量即表示在计算机中为该变量开辟一块内存空间,变量的值即该内存中所保存的值,可以使用变量名对该内存的内容进行访问或修改,或者通过先求出该变量所占内存的地址,然后直接对该内存进行访问或修改。变量对应的首地址称作变量的指针,指针变量是用于存放某一类型变量地址的变量,其值为所指向变量的内存地址。
  指针变量的声明规则为:类型标识符*标识符,其中“类型标识符”表示该指针变量所指向的变量的类型,标识符是该指针变量的名字。例如:
  int i=1;
  int *p=&i;
  那么此时p为一个指向int类型的指针,其值为变量i所占内存的地址,而*p即为该内存所保留的的数值1,其中运算符&是在执行取地址操作,就是说&i表示的是i的地址,而不是i的数值,同时也可以通过对指针变量p的操作来对i的值进行访问和修改。需要注意的是,与一般变量一样,对于外部或者静态指针变量,若在定义中未进行初始化,指针变量将自动被初始化为NULL,即为空指针。那么下面简单介绍一些关于指针的应用:
正确使用指针变量可以提升程序的执行效率
  正确使用指针变量可以编写高质量、高效率的C程序。以下从数组元素的引用、函数调用的代价和因为错误使用指针而造成的问题三方面进行分析, 以更清晰地介绍使用指针变量对C程序运行效率的影响。
数组元素的引用
  #include ""stdio.h""
  main()
  {
  int a[5]={1,2,3,4,5},i,*p;
  for (i=0;i<5;i++)
  printf(""%d "", a[i]);
  for (p=a;p   printf(""%d "",*p);
  }
  在该程序中,对数组元素的引用采用了两种方法:下标法和指针法。采用下标法时,C编译系统是将数组元素a[i]处理成*(a+i),即按数组首地址加上相对位移量得到要找的元素的地址,然后找出该单元中的内容。而采用指针法是用指针变量直接指向元素,不必每次都重新计算地址。所以指针法的执行效率要比下标法的高很多。
函数调用的代价
  #include ""stdio.h""
  struct s
  {
  int num; char name[10]; float score;
  }
  f(struct s *p)
  {
  int i;
  float sum=0,ave;
  for(i=0;i<5;i++,p++)
  sum=sum+p->score;
  ave=sum/5;
  printf(""%.0f,%.2f"",sum,ave);
  }
  main()
  {
    {struct s *p;
     struct s xs[5]={{1,""mali"",89},
  {2,""lili"",78},{3,""nimi"",90},{4,""lini"",65},
  {5,""yisu"",82}};
  p=xs;
  f(p);
  }
  在该程序中,实参传给形参的是结构体变量的地址,这样在函数调用时就无需复制大量数据,从而减少时间和空间的开销。编写程序时,如果需要传入一个占比较大内存的数据类型, 如数组或结构体变量,为了提高程序运行效率,都是传递该变量的地址。
指针指向的地址偏移的错误
  这种情况常出现的原因是, 错误地将指向动态分配内存的指针当着指向一般变量的指针使用。示例程序如下:
  void Test (void)
  {
  char *pChar=(char*)malloc(sizeof(char ));
  char chs;
  pChar=&chs;
  free(pChar);
  }
  该程序的目的是想将chs内容传递给pChar指针指向的内存,但该程序代码将会使指针pChar指向chs所占有的内存地址,其先前指向的内存空间将成为垃圾地址,因为程序没有办法再访问该内存空间了。这里pChar是一个野指针,程序将会导致内存泄漏。同时,在调用free 函数释放指针pChar的内存时,将会发生异常错误。因为此时pChar指向的内存已经不是由malloc函数动态分配的,不能使用free函数进行释放。要避免这样的情况发生就应该避免将指向动态分配内存的指针在释放前指向其他变量的内存地址。所以,我们发现,如果不能正确的使用指针不仅不能提高程序的执行效率,反而给我们带来了不必要的麻烦。
  指针应用千变万化, 关于指针的应用,还有很多内容值得探讨, 以上只是指针的一些基本应用, 只有在编程过程中不断总结指针的使用技巧, 通过实践中的不断摸索才能准确无误的应用指针。
参考文献:
[1] 谭浩强.C程序设计教程[M].清华大学出版社,2007.
[2] 侯永莉,王晨煜.解析C 语言的指针及应用[J].科技咨询导报,2007(12).

上一篇:基于Flash技术的虚拟仿真教学的应用与研究

下一篇:浅谈“头脑风暴法”在计算机教学中的应用