谈C语言中指针、地址和数组的相互关系

来源 :硅谷 | 被引量 : 0次 | 上传用户:zhangyangyingzi
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  [摘要]在学习C语言过程中,指针、地址和数组是最富有特色的内容,特别是指针、地址和数组之间相互关系更具有特色。掌握它们之间的相互关系将有助于C语言其他内容的学习,因此学好这部分内容是掌握C语言的关键。主要用图示法阐述指针和地址、指针和数组之间的联系。
  [关键词]C语言 指针 地址 数组 图示法
  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0120049-01
  
  指针是C语言中一个最重要概念之一,指针变量是用来存放另外一个变量地址,通过指针变量可以间接引用另外一个变量的内容。数组是由若干个元素按一定顺序关系组合而成的集合体,即数组中的每一个元素都属于同一个数据类型,数组名则是数组元素的首地址,用户在编程中用一个数组名和下标来唯一确定数组中的每一个元素。所以,指针、地址和数组以及它们之间的相互关系构成C语言最有特色部分。
  
  一、指针和地址
  
  (一)指针变量的定义
  在程序中定义了一个变量,那么在计算机内不仅定义了该变量的类型、名称,而且还在内存中分配了一块存储区域,这块存储区域的首地址称为该变量的指针。变量的值就存放在这块区域之中,在计算机内部,通过访问或修改这块区域的内容来访问或修改相应的变量。Turbo C语言中,对于变量的访问形式之一,就是先求出变量的地址,然后再通过地址对它进行访问。
  指针变量的一般定义为:
  类型标识符*标识符;
  其中“标识符”是指针变量的名字,标识符前加了“*”号,表示该变量是指针变量,而最前面的“类型标识符”表示该指针变量所指向的变量的类型。一个指针变量只能指向同一种类型的变量,也就是说,我们不能定义一个指针变量,既能指向一整型变量又能指向双精度变量。如定义了一个指针变量int*ip;说明该指针变量ip为指向整数的指针,用它存放整型变量的地址。
  (二)指针变量的引用
  指针变量中只能存放地址,因此,在使用中不能将一个整数赋给一指针变量。如:
  int *ip;ip=80;这种赋值是错误的。可以这样定义:
  int i=100,x;int *ip;
  定义了两个整型变量i,x,还定义了一个指向整数的指针变量ip。i,x中可存放整数,而ip中只能存放整型变量的地址。通过地址运算“&”可以把i的地址赋给ip:
  ip=&i;
  此时指针变量ip就指向整型变量i,假设变量i的地址为1600,这个赋值可理解为图1所示的联系。
  


  可以通过指针变量ip间接访问变量i,如:
  x=*ip;
  运算符*访问以ip为地址的存储区域,而ip中存放的是变量i的地址,因此,*ip访问的是地址为1600的存储区域,它就是i所占用的存储区域,所以上面的赋值表达式等价于
  x=i;
  另外,指针变量和一般变量一样,存放在它们之中的值是可以改变的,也就是说可以改变它们的指向,假设
  Int i,j,*p1,*p2;
  i=10 ;
  j=20 ;
  p1=&i;
  p2=&j;
  通过图示法阐述如下:
  
  如图2所示,采用图示法展示出普通变量i、j和指针变量p1、p2之间的关系,指针其实是内存地址,而内存中的单元是按字节编址(每个地址编码对应一个字节空间),从图中可以看出整型变量i和j分别占用两个字节的内存空间。同时也可以看出每个指针变量也是占用两个字节的空间,因为每个指针变量都是存储一个地址码。
  通过指针访问它所指向变量的值是以间接访问的形式进行的,所以比直接访问一个变量要多费时间,而且不直观,因为通过指针要访问哪一个变量,取决于指针的值(即指向),例如“*p2=*p1;”实际上就是“j=i;”,前者不仅速度慢而且目的不明。但由于指针是变量,可以通过改变它们的指向,以间接访问不同的变量的值,这给程序员带来灵活性,也使程序代码编写得更为简洁、高效。
  
  二、指针和数组
  
  指针和数组有着密切的关系,任何能由数组下标完成的操作也都可用指针来实现,而且使用指针处理数据,有助于产生占用空间小,运行速度快且高质量的目标代码。
  (一)指向数组元素的指针
  在C语言中,数组的指针就是数组的起始地址(也就第一个元素的地址),如:
  int a[10],*p;
  对于数组a[i]表示数组a的第i+1个变量,a是数组名表示该数组的首地址,为常量,即a与&a[0]等价,而p=a则将数组a的首地址&a[0]赋给指针变量p。通过p来访问数组元素时要注意以下问题:
  1.P,a与&a[0]它们是等价的,都表示数组a的首地址。
  2.p[i]和a[i]都是代表该数组的第i+1个元素。
  3.p+i和a+i代表了第i+1个元素的地址,所以我们也可以使用*(p+i)和*(a+i)来引用对象元素。
  4.表达式p+1为指向p的下一个存储单元,即a[0]下一个元素a[1]的存储单元,也就是p+1等价于&a[1]。
  (二)指向二维数组的指针
  为了说明问题,假设有如下程序段:
  int a[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}},i,j,*p;
  P=&a[0][0];
  A为二维数组名,此数组有3行5列,共15个元素。也可这样来理解,数组a由三个元素组成:a[0],a[1],a[2]。而每个元素又是一个一维数组,且都含有5个元素(相当于5列),例如,a[0]所代表的一维数组所包含的5个元素为a[0][0],a[0][1],a[0][2],a[0][3],a[0][4]。数组名a也代表二维数组的首地址,也可看成是二维数组第0行的首地址。a+1就代表第1行的首地址,a+2就代表第2行的首地址。如果此二维数组的首地址为1000,由于第0行有5个整型元素,所以a+1为1010,a+2也就为1020,如图3所示。
  把a[0],a[1],a[2]看成是一维数组名,可以认为它们分别代表它们所对应的数组的首地址,也就是讲,a[0]代表第0行中第0列元素的地址,即&a[0][0],a[1]是第1行中第0列元素的地址,即&a[1][0],根据地址运算规则,a[0]+1即代表第0行第1列元素的地址,即&a[0][1],a[i]+j即代表第i行第j列元素的地址,即&a[i][j]。将指针p指向二维数组a的首地址,p+1就指向下一个元素,由于每行5个元素,p+i*5+j就是第i行第j列元素的地址。
  


  
  参考文献:
  [1]谭浩强,C程序设计(第二版),北京:清华大学出版社,1999.
  [2]严桂兰,C语言程序设计与应用教程,福建:厦门大学出版社,2001.
其他文献
[摘要]Visual FoxPro数据库程序设计是全国计算机等级考试的二级考试科目之一,随着目前越来越多的考生报考该科目,Visual FoxPro数据库程序设计已成为很多考生关注的一门语言,通过分析上机考试需注意的几个要点和几种常考题型的解题思路,希望能为报考该科目的考生提供一些帮助。  [关键词]全国计算机等级考试 Visual FoxPro程序设计 上机考试  中图分类号:TP3文献标识码:
期刊
[摘要]远程协助为我们提供一种获取帮助的有效手段,在遇到问题时我们可以通过远程协助从外部获取所需帮助。计算机技术精通的人可以通过远程协助替别人解决问题。  [关键词]远程协助 远程桌面  中图分类号:TP3 文献标识码:A文章编号:1671-7597(2009)0120061-01    一、Windows远程协助的应用    “远程协助“是Windows附带提供的一种简单的远程控制的方法。早期版
期刊
[摘要]随着GIS的发展和广泛应用,利用软件编制地图已成为地图编制的一种重要手段,其社会、经济效益十分显著,应用前景广阔。介绍利用MapGIS软件进行数据处理的相关事项,其与Auto CAD软件、Microsoft Word软件以及Microsoft Office软件的应用,并且根据实际操作总结一些解决问题的方法,同时针对坐标转换等问题提出操作的技巧,以提高成图速度和美观效果。  [关键词]Map
期刊
[摘要]针对目前互联网在高校的发展普及,提出高校二级网站的建设方案。此方案充分利用ASP.NET2.0技术,使高校的二级网站建设变的快速,高效,并且安全。  [关键词]网站建设 ASP.NET 主题 Menu 用户控件 ObjectDataSource 三层结构  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0120063-01    随着互联网的普及,越来越多的高校都
期刊
[摘要]详细阐述在LINUX下安装JDK及环境变量具体配置过程。  [关键词]Java 环境变量  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0120041-01    一、JDK的安装及环境变量设置    1.去http://java.sun.com/j2se/1.6.0/download.html下载一个Linux Platform的JDK,建议下载RPM自解压格
期刊
[摘要]介绍基于AT89C51单片机的温度测量系统硬件电路设计方法、工作原理以及程序设计。利用PT1O0阻值随温度变化的特点,将其和其他三个电阻构成非平衡电桥,因而温度的变化可转化成电桥输出微弱电压信号的变化,电压信号经集成运放电路放大后送到A/D转换器,将模拟信号变换成数字信号,单片机根据输入量和设定量进行运算,将结果送到数码管显示,完成对温度的测量。该系统可实现对温度实时较精确的测量,测量范围
期刊
[摘要]通过统一建模语言(UML),提出了基于UML的构件抽取的方法,在此基础上,运用UML的构件抽取方法对教务管理系统进行了构件抽取,为在开发基于构件的教务管理系统中进行构件的抽取提供一种可行的解决方案。  [关键词]统一建模语言 构件 教务管理  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0120062-01    一、统一建模语言及构件发展概况    软件构件技
期刊
[摘要]地理信息系统(GIS,Geographic Information System)是一种基于计算机的工具,它可以对在地球上存在的东西和发生的事件进行成图和分析。GIS技术把地图这种独特的视觉化效果和地理分析功能与一般的数据库操作(例如查询和统计分析等)集成在一起。这种能力使GIS与其他信息系统相区别,从而使其在城市智能交通管理中起到相对应的实用价值。  [关键词]城市交通管理 系统构架 共
期刊
[摘要]随着电子商务技术的发展,网络交易安全成为电子商务发展的核心和关键问题。基于Web Service的电子商务安全的问题已经成为电子商务顺利发展的重要市场环境条件。在分析基于Web Service的电子商务的主要安全要素的基础上,具体介绍采用目前电子商务领域的几种安全技术来消除电子商务活动中的安全隐患。  [关键词]Web Service 电子商务 安全技术  中图分类号:TP3文献标识码:A
期刊
[摘要]简要分析和介绍计算机网络入侵检测系统的主要类型及其技术,给出一个网络入侵检测系统的技术实现机理。  [关键词]计算机 网络 安全 入侵检测  中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0120073-01    随着计算机网络规模的爆炸式增长和网络应用的日益深化,安全问题愈发突出,传统的单一安全技术如防火墙、授权与身份认证系统、信息加密等,都是以静态的方式保障
期刊