C语言的那些小秘密之指针(二)

发表于:2011-9-21 10:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bigloomy(CSDNblog)    来源:51Testing软件测试网采编

  现在每篇博客都要求有摘要,但是如果我就这样直接接着上一篇的内容开始讲的话可能第一次看我博客的人都不知道我在说啥,所以我还是把前一篇博客的第一段作为摘要搬过来吧。

  懂得C语言的人都知道,C语言之所以强大,以及其自由性,绝大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。所以从我的标题加了个(一)也可以看出指针的重要性,我尽可能的向大家交代清楚我对于指针的理解。所以在讲解的过程中我尽可能的用代码加文字的描述方式,通过代码的分析来加深我们对于指针的理解,我给出的都是完整的代码,所以读者可以在看的过程中直接copy下去即可运行,希望下面的讲解能够对你有所帮助。

  在此也特地强调下,如果以后出现类似的情况时,我博客的第一段均作为摘要。如果已经在前面的博客中看过摘要的,那么重复的摘要部分可跳过不读,直接进入正文。

  接着上一篇的指针部分,我们接下来看看数组的指针和指向数组的指针变量。数组的指针就是数组的起始地址,数组元素的指针是数组元素的地址。对于一个数组元素的引用我们通常可以使用两种方法:

  1、下标法,如a[8]。

  2、指针法。

  其中使用指针法的优点是使得目标程序占内存少、运行速度快,从而使得其质量更高。为什么说指针具有这样的优点呢,我想还是有必要在此给出点我解释,因为指针在32位机器下占用4个字节,如果函数传输一个占用内存很大的对象例如:int   a[2000],显然用指针引用传送简单,节省了内存,也节省了用于复制对象的时间;如果我们用下标法来引用数组,还得去取数组的起始地址,通过base   +   offset再转换为直接寻址,比指针多了操作。

  从以上可以看出,指针能力很强,能完成许多事情,C的精髓就在于指针,使得C能接近ASM的效率。所以我们在写编写程序的时候有必要充分利用指针的优点,编写出高效的C语言代码。

  下面来看看一个代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
 int a[8];
 int *p;
 //***************************用下标法打印a数组**************************//
 printf("\n***************************用下标法打印a数组**************************\n");
 for(int i=0;i<8;i++)
 {
  a[i]=i;
  printf("a[%d]=%d\t",i,a[i]);
 }
 printf("\n****************************end end end******************************\n");
 //****************************end end end******************************//

 //***************************使用指针变量打印**************************//
 printf("\n***************************使用指针变量打印**************************\n");
 p=a;
 for(int j=0;j<8;j++)
 {
  printf("p%d=%d\t",j,*p++);
 }
 printf("\n****************************end end end******************************\n");
 //****************************end end end******************************//
 printf("\n");

 //************************用数组名指针运算打印*************************//
 printf("\n************************用数组名指针运算打印*************************\n");
 for(int k=0;k<8;k++)
 {
  printf("a[%d]=%d\t",k,*(a+k));
 }
 printf("\n****************************end end end******************************\n");
 //****************************end end end******************************//
 
 //****************************打印二维数组b的值地址********************//
 printf("\n***************************打印二维数组b的值及地址*******************\n");
 int b[4][4];
 for(int n=0;n<4;n++)
 {
  for(int m=0;m<4;m++)
  {
   b[n][m]=n*m;
   printf("%d\t",b[n][m]);
   printf("%d\t",&b[n][m]);
  } 
  printf("\n");
 }
 printf("\n****************************end end end******************************\n");
 //****************************end end end******************************//
  
 int *pp=&b[0][0];
 int **ppp=&pp;

 //*********************二维数组b的地址、以及pp和*ppp的值****************//
 printf("\n*********************二维数组b的地址、以及pp和*ppp的值****************\n");
 printf("\n&b[0][0]=%d\tpp=%d\t*ppp=%d\n",&b[0][0],pp,*ppp);
 printf("\n****************************end end end******************************\n");
 //****************************end end end******************************//

 //*****************二维数组b[0][0]、以及*pp和**ppp的值******************//
 printf("\n*****************二维数组b[0][0]、以及*pp和**ppp的值******************\n");
 printf("\nb[0][0]=%d\t*pp=%d\t**ppp=%d\n",b[0][0],*pp,**ppp);
 printf("\n****************************end end end******************************\n");
 //****************************end end end******************************//

 //***************************使用指针变量打印**************************//
 printf("\n***************************使用指针变量打印**************************\n");
 for(pp=&b[0][0];pp<(&b[0][0]+16);pp++)
  printf("%d\t",*pp);
 printf("\n****************************end end end******************************\n");
 //****************************end end end******************************//

 printf("\n&pp=%d\t&ppp=%d\n",&pp,&ppp);

 printf("\nppp=%d\t*ppp=%d\n",ppp,*ppp);

 printf("%d\t",*(*ppp-1));


 return 0;
}

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号