




已阅读5页,还剩63页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指针6.2指针的概念6.3指针与数组6.4字符串的指针6.5指针数组和指向指针的指针,6.2.1地址与指针的概念,6.2.2指针的定义与引用,6.2指针的概念,指针概述,指针是一种数据类型。所谓指针,就是指存放数据的内存地址。指针变量是一种变量,该变量中存放的数据就是指针类型的数据。对一个变量或数组元素来说,可以通过变量名或数组名下标来引用,也可以通过指针变量来引用,但需要事先将指针变量“指向”变量或数组,所谓“指向”就是将变量或数组的地址存放到指针变量中。,指针和变量,(一)、指针,1、内存单元和地址内部存储器是由多个内存单元组成的,每个内存单元都有自己独有的地址,称为内存单元地址。,2、变量与地址,程序中可以用变量来存放各种数据,因此每个变量都需要分配连续的内存单元。由于数据类型的不同,每个变量需要分配的内存单元数目也不同。例如,字符型变量需要占用1个内存单元;短整型变量需要占用连续的2个内存单元;单精度变量需要占用连续的4个内存单元;双精度变量需要占用连续的8个内存单元。,当一个变量只占用一个内存单元时,内存单元的地址就是变量的地址;当变量占用连续的若干个内存单元时,最前面一个单元的地址就是该变量的地址。,例如,有一条定义语句“inti3,j=5;floatf;”,给它分配的内存单元如图1所示,而记录下来的变量与地址对照表如图2所示。,变量与地址对照表,图2,通过变量名查取变量的地址,再从变量对应地址的内存单元中取得值或将某值存入变量对应地址的内存单元中称为直接存取方式。,3、数组与地址,对一个数组来说所分配的内存单元必须是连续的并且是按顺序对应数组元素的。每个数组元素也要占用连续的内存单元。数组类型不同,每个数组元素占用的内存单元数也不同。数组占用的总单元数等于数组长度每个数组元素占用的内存单元数。,当一个数组元素只占用一个内存单元时,内存单元的地址就是该数组元素的地址;当数组元素占用若干个连续的内存单元时,最前面一个单元的地址就是该数组元素的地址。当一个数组占用连续的若干个内存单元时,最前面的单元地址称为数组的首地址,也是第一个数组元素的地址。,每个数组元素的地址可以通过下列公式求得:数组元素ai的地址数组首地址i数组元素的数据类型所占用单元数,对源程序进行编译时,每遇到一个数组,按其类型和长度分配内存单元,同时记录数组名、数据类型、数组长度、数组首地址。例如有一条定义语句“inta3=1,2,3;”,给它分配的内存单元如图3所示,而记录下来的数组与地址对照表如图4所示。,地址,内存单元,整型数组元素a0,整型数组元素a1,整型数组元素a2,图3,数组与地址对照表,图4,(二)、指针变量,由于存放地址的变量像一个指针,指向要存取值的变量,所以将这种变量称为“指针变量”。由于地址是一种特殊的数据类型,所以存放地址的指针变量和存放字符型、整型、实型数据的变量是不同类型的变量。,我们来看看如何使用指针变量,通过间接存取方式来完成赋值语句“a1=i*j;”操作的。事先将变量i、j和数组元素a1的地址分别存入指针变量pi、pj、p。操作过程是:先从指针变量pi中取出i的地址,再从该地址中取出变量i的值;按同样方法取出j的值进行相乘;再从指针变量p中取出数组元素a1的地址,将运算结果存入该地址中。,C语言规定:,变量地址只能利用运算符通过运算来获得。这个运算符是“int*p=,(二)、指针变量的引用方式,1、给指针变量赋值,使用格式为:指针变量表达式。这个表达式必须是地址型表达式,例如:inti,*p_i;p_i=,2、直接引用指针变量名,需要用到地址时,可以直接引用指针变量名。,例如:inti,j,*p=,3、通过指针变量来引用所指向的变量,使用格式为:*指针变量名。在程序中“*指针变量名”代表它所指向的变量。,例如:inti=1,j=2,k,*p=,(三)、取地址运算符与指针运算符,取地址运算符和指针运算符的运算对象、运算规则、结合性如表所示。,取地址运算符的运算对象必须是已定义过的变量或数组元素,但不可以是数组名。运算结果是运算对象的地址。例如,定义了变量a、数组b10,则for(;pa+10;p+)scanf(“%d”,p);scanf(“%d”,3、关于使用“指针法”处理一维数组元素的下标越界问题,C语言对用“指针法”引用数组元素时,对下标是否越界也不作检查,即允许下标越界。,例如,定义了整型数组a10,并使同类型的指针变量p指向了数组a的首地址。则下列对a数组的元素引用都是允许的:,*(p-1)代表数组元素a0前面2个单元中存放的数据(看成整数)*(p+10)代表数组元素a0前面2个单元中存放的数据(看成整数),虽然C语言允许处理数组元素时下标可以越界,但在程序中要尽量避免。当出现下标越界的情况,如果你使用的是数组元素值,显然这个值不知为何值;如果你是将某个值存入该数组元素,结果将会破坏对应内存单元中原来的值,使得后面程序运行时,结果不正确,甚至出现预料不到的问题,而这样的错误很难查找。,指向二维数组的指针变量的使用,1、指针变量指向二维数组的某个元素,当指针变量指向二维数组的某个元素时,利用指针变量来处理该数组元素和处理一维数组元素的方法相同。,(1)让指针变量指向二维数组的某个元素的方法。用赋初值方式的格式为:*指针变量inti,j;for(i=0;i2;i+)for(j=0;j3;j+)p=,程序如下:,2、指针变量指向二维数组的首地址,当指针变量指向二维数组的首地址时,也可以处理数组中的任何一个元素。,(1)让指针变量指向二维数组首地址的方法。,使用赋初值或赋值方式都可以使指针变量指向二维数组的首地址。,用赋初值方式的格式有两种:*指针变量二维数组名*指针变量inti,j;for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,p+i*3+j);for(i=0;i2;i+)printf(“n”);for(j=0;j3;j+)printf(“%10d”,*(p+i*3+j);,例3:重编例1,要求用指向二维数组首地址的指针变量按一维数组方式处理。,main()inta23,*p=a;inti,j;for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,p);p+;p=a;for(i=0;i2;i+)printf(“n”);for(j=0;j3;j+)printf(“%10d”,*p);p+;,3、指针变量指向二维数组中某个一维数组,(1)让指针变量指向二维数组中某个一维数组的方法。,如果你希望将指针变量指向二维数组中某个一维数组,首先要按下列格式定义一个指针变量:(*指针变量)m其中的m是对应二维数组的列长度,然后再用赋初值或赋值方式将该指针变量指向二维数组的首地址(*指针变量)m二维数组名(赋初值)指针变量二维数组名(赋值),二维数组中第i行对应的一维数组首地址可以用下列表达式来获得:*(指针变量i),使用这种指针变量,需要注意以下几点:,定义这种指针变量时,圆括号不能丢。,定义这种指针变量时,m必须是整型常量表达式,并且其值要等于希望指向的一维数组的长度。,定义这种指针变量后,赋初值或赋值时应该赋予列长度为m的二维数组首地址,然后用表达式方式来获得二维数组中某个一维数组的首地址。,(2)二维数组元素的引用方法。,当某个指向一维数组的指针变量已指向对应二维数组的首地址后,就可以用像处理一维数组元素的方式来处理这个二维数组中已指向的一维数组。具体的格式如下:,数组元素地址*(指针变量行下标)列下标数组元素引用*(*(指针变量行下标)列下标),例如语句“inta25,(*p)5=a;”定义了二维数组a25和指向具有5个元素的一维数组指针变量p,并且使p指向二维数组a的首地址。则对应二维数组中2个一维数组的首地址如下:,二维数组中的一维数组,用指针变量表示对应一维数组的首地址,a0a1,*(p0)*(p1),二维数组元素的引用格式如下:,数组元素a00a01a02a03a04引用格式*(*(p+0)+0)*(*(p+0)+1)*(*(p+0)+2)*(*(p+0)+3)*(*(p+0)+4)数组元素a10a11a12a13a14引用格式*(*(p+1)+0)*(*(p+1)+1)*(*(p+1)+2)*(*(p+1)+3)*(*(p+1)+4),例4:重编例1,要求使用指向二维数组中一维数组的指针变量,程序清单如下:,main()inta23,(*p)3=a;inti,j;for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,*(p+i)+j);for(i=0;i2;i+)printf(“n”);for(j=0;j*pp)flag=g;break;if(*pa*pp)flag=l;break;pa+,pp+;If(flag=m),if(flag=m)break;elseif(flag=g)print(“MoreLarger!”);elseprintf(“MoreSmaller!”);printf(“%s=%sn”,p,a);,6.5指针数组和指向指针的指针,当某个数组被定义为指针类型,就称这样的数组为指针数组。指针数组中的每个元素都相当于一个指针型变量,只能存放地址型数据。当定义的某个指针型变量专门用来存放其它指针变量的地址时,这样的指针变量就称为指针的指针,也叫二级指针。,1、指针数组的定义,需要注意指针数组是指针类型的,对其元素所赋的值必须是地址值。,格式存储类型数据类型*指针数组名1长度1初值1,功能定义指向“数据类型”变量或数组的指针型数组,同时给指针数组元素赋初值。这些指针变量具有指定的“存储类型”。,说明(1)指针数组名是标识符,前面必须有“*”号。,(2)在一个定义语句中,可以同时定义普通变量、数组、指针变量、指针数组。可以给某些指针数组赋初值,而另一些指针数组不赋初值。,(3)定义指针变量时的“数据类型”可以选取任何基本数据类型,也可以选取其它数据类型。,(4)省略“存储类型”,默认为自动型(auto)。,(5)其中的“初值”与普通数组赋初值的格式相同,每个初值通常是“inti;for(i=0;i5;i+)pi=si;for(i=0;i5;i+)scanf(“%s”,pi);for(i=0;i5;i+)printf(“%sn”,pi);,3、多级指针的定义和应用,在C语言中,把这种指针型变量称为“指针的指针”,意为这种变量是指向指针变量的指针变量,也称多级指针。通常使用的多级指针是二级指针,相对来说,前面介绍的指针变量可以称为“一级指针变量”。,二级指针变量的定义和赋初值方法如下:,格式存储类型数据类型*指针变量名初值,,功能定义指向“数据类型”指针变量的二级指针变量,同时给二级指针变量赋初值。,说明,(1)二级指针变量名的构成原则是标识符,前面必须有“*”号。,(2)在一个定义语句中,可以同时定义普通变量、数组、指针变量、指针数组、二级指针变量等。可以给某些二级指针变量赋初值,而另一些二级指针变量不赋初值。,(3)定义时的“数据类型”可以选任何基本数据类型,也可以选取以后介绍的其它数据类型。这个数据类型是它将要指向的指针变量所指向的变量或数组的数据类型。,(4)其中的“初值”必须是某个一级指针变量的地址,通常是“inti;for(i=0;i5;i+)pi=,课堂练习指针应用程序设计例题,例1:输入n(不大于20)个单精度数存入一维数组,用指针变量处理数组元素的方式将其逆序存放后输出。n从键盘输入。,main()floata20,x,*pb,*pe;intn,k,i;scanf(“%d”,例2:求35整数矩阵中的最大元素、最小元素、所有元素的平均值。(要求用指向二维数组首地址的指针变量按二维数组排列方式处理二维数组元素。),程序清单如下:,main()inta35,*p=a,max,min,i,j;floatave=0.0;for(i=0;imax)max=*(p+i*5+j);,if(*(p+i*5+j)min)min=*(p+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新疆昌吉回族自治州某中学2023-2024学年八年级下学期期末语文试题
- 2025年光伏发电考试试题及答案
- 云南省德宏州2023-2024学年八年级下学期期末检测数学试卷(含解析)
- 2025年保安员知识考试题及参考答案
- 2025年安徽省合肥市中级会计职称经济法预测试题含答案
- 纺织品生命周期评估与国际贸易法规适应性研究考核试卷
- 家用纺织品市场消费者价格接受区间研究考核试卷
- 医疗物资采购与应急管理机制考核试卷
- 家电配件物流配送中心的自动化升级计划考核试卷
- 化妆品毒理学与皮肤老化影响评价考核试卷
- 登革热与基孔肯雅热防控指南
- 新生儿疾病诊疗规范诊疗指南诊疗常规2022版
- 脱不花三十天沟通训练营
- 小学数学三年级奥数举一反三课件
- GB/T 7689.2-2013增强材料机织物试验方法第2部分:经、纬密度的测定
- 三方产品购销合同
- 机构编制实名制管理工作概要课件
- 变电室高压停电工作票1
- 细胞信号通路与癌症课件
- 达格列净课件
- DB52∕T 046-2018 贵州省建筑岩土工程技术规范
评论
0/150
提交评论