当前位置:首页 > 作文大全 > c语言函数指针 C语言的指针解析
 

c语言函数指针 C语言的指针解析

发布时间:2019-07-06 03:53:47 影响了:

  摘要:C语言作为计算机类专业一门重要的基础课程,是学生学习程序设计的开端,后续专业课程大多以此作为前提。而在C语言的学习中,指针又是一个重点以及难点。文章首先介绍了指针的概念以及指针变量的定义,其次重点介绍了指针与数组之间的关系,最后介绍了值传递以及地址传递的区别以及指针变量作为函数参数的应用。
  关键词:C语言; 指针; 指针变量; 地址传递
  中图分类号:TP312文献标识码:A文章编号:16727800(2012)008004302
  作者简介:卫五波(1981-),男,硕士,四川邮电职业技术学院助理讲师,研究方向为Web应用和网络通信;陈冬(1981-),男,硕士,四川邮电职业技术学院助理讲师,研究方向为移动游戏平台和中间件系统。
  1指针与指针变量
  1.1指针
  C语言中,任何数据都会占用内存单元的。计算机内存的每个存储位置都对应唯一的存储地址,而变量名作为变量数据存储区域所取的名字,代表的是一个内存编号,而这个内存编号对于用户来说是未知的。如定义:int a=12。
  变量名a代表某个内存单元,而变量值12则是这块内存单元里面的内容。在整个程序运行过程中,通过变量名来访问变量,变量名a所代表的这块内存单元不变,所改变的只是这块内存单元里面的值。
  C语言也支持使用变量存储地址来对变量进行存取操作,要取得变量的存储地址,可使用取地址运算符&,如&a表示变量a的存储地址;而变量的存储地址就是指针。
  1.2指针变量
  指针类型就是C语言中用于表示存储地址的数据类型,而专门用来存放变量存储地址的变量则称为指针变量。
  格式:数据类型 *指针变量名。跟普通变量不同的是,所有指针变量占用的内存单元大小是一样的,前面的数据类型代表的是指针变量所指向变量的数据类型。如以下代码:
  int a,*b;//a是一个int型变量,b是一个指向int型数据的指针变量
  b=&a;//代表b指向a
  下面代码是错误的:
  float a;
  int *b=&a//此条语句有误,b只能指向int型变量
  为了访问指针变量所指向变量的值,可以通过间接访问运算符*,如:
  int a=12,*b=&a;
  *b就代表取出b所指向变量a的值,也就是*b=*(&a)=a。
  1.3二级指针变量
  在C语言中,任何值都有所对应的内存地址,上述介绍的指针变量是指向普通变量的,也就是普通的指针,称为一级指针变量。
  还有一种指针变量所指向的变量不是普通变量反而还是一个指针变量,这种变量称为二级指针变量。如:
  int a=12;//普通变量a
  int *b=&a;//一级指针变量b,指向普通变量a
  int *c=&b;//二级指针变量c,指向指针变量b
  而这时,*c只是代表取c所指向的变量b里面的值:&a,而a的地址又是未知的。所以,对于二级指针变量c,要想取出a的值,必须需要两个间接访问运算符**,如**c=**(&b)=*b=*(&a)=a。
  2指针与数组的关系
  2.1指针与一维数组
  数组元素在内存中是顺序存放的,并且数组名代表的是这一块内存单元的首地址,数组其他元素的地址可以根据每个元素所占用的内存单元依次推知。因此,一维数组的数组名实际上就是该数组的指针。如以下定义:
  int a\[10\]={1,2,3,4,5};int *p=a;
  此时,p指向数组中的第1个元素(a\[0\]),p+1指向第2个元素(a\[1\]),依次类推。当然,p最开始也可以指向其他元素,如指向第4个元素:p=&a\[3\];
  在指针的运算中,经常会跟自增或自减运算符结合起来使用,如以下代码:
  int a\[\]={20,21,22,23,24,25,26,27,28,29};
  int *p,i;
  p=&a\[4\]; //p初始指向第5个元素
  printf("%d\n",*(++p));/*由于自增运算符在前,所以p先指向a\[5\],之后输出为25*/
  printf("%d\n",(*p)++);/*先输出p指向的内容25,之后再把指向的内存单元的内容加1,也就是a\[5\]的值变为26,p的指向不变/
  printf("%d\n",*(--p));/*先改变p的指向,指向a\[4\],之后输出a\[4\]的内容24*/
  printf("%d\n",- -(*p)); /*先把p所指向的a\[4\]的内容减1,变为23,之后输出23*/
  for(i=0;i<10;i++)
  printf("%4d",a\[i\]);/*输出结果为20 21 22 23 23 26 26 27 28 29*/
  printf("\n");
  上述代码就是指针与数组之间关系的一个典型示例,通过自增或自减运算符不光改变p的指向,也可以改变p所指向的内存单元里面的内容(也就是数组元素的内容)。
  2.2指针与二维数组
  由于二维数组可以看成是多个一维数组,如以下定义:int a\[3\]\[4\];可以把二维数组a看成3个长度为4的一维数组a\[0\],a\[1\],a\[2\](假定二维数组按行存储);a\[0\]为第一个一维数组的数组名,里面有4个元素:a\[0\]\[0\],a\[0\]\[1\],a\[0\]\[2\],a\[0\]\[3\];a\[1\]和a\[2\]依次类推。此时,虽然二维数组名a和&a\[0\]\[0\]表示的是同一个地址,但是指向的却是完全不同的两种存储区域。a指向的是一维数组a\[0\]中4个元素的存储区域的首地址,&a\[0\]\[0\]指向第一个元素a\[0\]\[0\]的地址。此时的a相当于二级指针,a等价于&a\[0\],而a\[0\]又等价于&a\[0\]\[0\],所以**a才等价于a\[0\]\[0\],*a只是a\[0\],而a\[0\]还是地址,此值对于用户来说是未知的。如以下代码:

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3