电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > PPT文档下载
分享到微信 分享到微博 分享到QQ空间

C语言程序设计(09763)第七章

  • 资源ID:89351661       资源大小:908KB        全文页数:25页
  • 资源格式: PPT        下载积分:10金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要10金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

C语言程序设计(09763)第七章

C语言程序设计,孙淑霞 罗奕 主编,第七章 指 针,7.1 指针和地址 计算机在设计时根据地址总线为内存的每个字节都赋予了一个编号,这个编号叫做内存的地址。 通过变量名来直接存取变量值的方式称为“直接存取”方式。 在C语言中还可以通过称之为“间接存取”的方式来存取变量。先定义一个变量p,假设编译系统给它分配的内存地址为1000,然后将另一变量a的地址2011存放到变量p中,访问变量a时,可以先从变量p的内存地址1000中读出a的地址2011,再到2011去访问变量a的值。这里,变量p相当于一个指示牌,它的内存中存放的2011指示了要访问的对象的地址,所以将表示变量a的地址的2011叫做“指针”,即内存地址就是指针,而存放变量a的地址(即指针)的变量p叫做“指针变量”。,7.2 指针变量的定义和引用,7.2.1 指针变量的定义 形式:类型名 *指针变量名; 指针变量赋地址通常有如下几种方式: 通过地址运算符“ 通过库函数获得内存地址。 给指针变量赋空地址,即将NULL值赋给指针变量,地址为NULL的指针变量称为空指针。,7.2.2 指针的引用,在程序中定义了指针变量并对其赋值后,就可以使用指针了。例如: int x=10,*p= 表示将20存放到指针变量p所指的内存单元中,而p指向的是变量x,所以现在x的值变为20。,【例7.1】读程序,理解通过指针引用变量来进行运算。 #include void main() int a,b,c; int *pa,*pb; pa= ,程序运行实例如下: 10 a=10 b=11 a=50 b=13 c=50,7.3 指 针 运 算,指针运算是指对指针变量中的值进行的一种运算,其实是对指针变量中保存的内存地址进行运算,通过地址的变化来改变指针所指向的对象。 7.3.1 指针的移动 指针移动是指通过对指针变量重新赋值或对指针变量进行加上或减去一个数,使指针变量从当前位置指向一个新的存储单元。 针变量加上或减去一个数之后,指针变量的值如何变化和指针变量的基类型有关。 例如:一个int型的指针变量加1,其指针变量会从当前内存地址向地址增大的方向移动2个字节,而对一个double类型的指针进行减1运算,它将会从当前地址向地址减小的方向移动8个字节。,7.3.2 指针相减 指针相减是指对两个指针变量作减法运算,其结果是两个指针所指内存地址之间相差的存储单元个数。指针相减一般用于变量占用连续存储空间(比如数组)的情形,在其他情况下无实际意义。 7.3.3 指针比较 对于指向连续内存区域的两个或多个指针,可以通过关系运算对它们进行比较,以确定哪个指针指向的变量地址在前,哪个在后。通常指向同一目标(如同一数组)的指针进行比较时才有意义。,7.4 指针与数组,7.4.1 指向一维数组的指针 定义了一个整型数组a和一个指向该数组的整型指针变量p: int a10, *p=a; 通过下面的语句可以访问数组a中的每个元素并为其赋值100: for(;p-a10;p+) *p=100; 然后可按下面方式访问并输出数组a中所有元素的值: int k; for(k=0;k10;k+) printf(“%d “,*(a+k);,上面的语句也可写成: int k; for(p=a,k=0;k10,k+) printf(“%d “,*(p+k); /*这句也可写成 printf(“%d “,pk);*/ 由此可见,数组元素ak可以用*(a+k)来引用,即表达式ak可以用*(a+k)来表示,而表达式*(p+k)也可用pk来表示。这里pk不是指数组p的第k个元素。 通过指针引用一维数组元素,7.4.2 通过地址引用二维数组元素,二维数组a的每个元素的地址可以由&aij来表示,也可以通过每行的首地址来表示,如元素a12的地址&a12也可以用a1+2来表示,元素aij的地址也可以用ai+j来表示。实际上,对于上面定义的二维数组a的任一元素aij,其地址可用以下5种表达式来表示: &aij ai+j *(a+i)+j &a00+4*i+j a0+4*i+j,二维数组元素的引用也可用下面5种表达式来表示: aij *(ai+j) *(*(a+i)+j) *(&a00+4*i+j) (*(a+i)j 二维数组a中元素aij的5种不同地址表示法及5种不同元素引用方法,7.4.3 通过指针数组引用二维数组元素,例如:int *p3, a34; 根据运算符的优先级,这里定义的指针数组*p3中的的优先级高于*,因此p首先与结合构成p3,表明p为一个一维数组,再与*结合,说明该一维数组是一个由指针变量构成的数组,其类型为int。 如果有下面的赋值: p0=a0; p1=a1; p2=a2; 则p0、p1和p2分别指向二维 数组a的每行元素的起始地址,此时 指针数组p与二维数组a之间的关系 如图:,二维数组a的元素可采用如下形式: *(pi+j) *(*(p+i)+j) (*(p+i)j pij 7.4.4 通过行指针引用二维数组元素 pij *(pi+j) *(*(p+i)+j) (*(p+i)j,【例7.5】读程序,理解利用指针数组和行指针引用二维数组元素。 #include“stdio.h“ #include“string.h“ void main() int a34, *p13,(*p2)4; int i,j; for(i=0;i3;i+) p1i=ai; /*利用指针元素指向二维数组的行*/ for(j=0;j4;j+) *(p1i+j)=10*i+j; /*利用指针元素引用二维数组元素*/ ,p2=a; /*将行指针指向二维数组起始地址*/ for(i=0;i3;i+) for(j=0;j4;j+) printf(“%5d“,(*(p2+i)j); /*利用行指针引用二维数组元素*/ putchar('n'); 程序运行结果如下: 0 1 2 3 10 11 12 13 20 21 22 23,7.5 指针与字符串,7.5.1 用字符数组处理字符串 对于一个字符串,通常是用一个一维字符数组来存放,并把一维字符数组作为一个整体(即字符串)来处理,C语言也专门提供了处理字符串的库函数。例如: #include“string.h“ void main() char cstr20; puts(“请输入一个字符串:“); gets(cstr); printf(“该字符串的长度是: %dn“,strlen(cstr); ,7.5.2 用指针处理一维字符数组,由于字符串是以字符数组的形式存储的,因此,用指针处理字符数组的元素和字符串就很容易了;判断是否到字符串结束可以通过判断是否遇到'0'字符来确定。 【例7.7】输入一个字符串,编写程序通过字符指针计算字符串的长度。 #include“stdio.h“ #include“string.h“ void main() char cstr20, *pc=cstr; int length=0; puts(“请输入一个字符串:“); gets(pc); while(*pc!='0') length+; pc+; printf(“字符串的长度是:%dn“,length); ,程序运行实例如下: 请输入一个字符串: and93mn 字符串的长度是:7,【例7.8】不使用库函数strcpy(),编写程序利用指针将一字符串src复制到字符数组dest中。 #include“string.h“ #include“stdio.h“ void main() char src80,dest80,*ps,*pt; ps=src; /*将ps指向字符串src*/ pt=dest; /*将pt指向字符串dest*/ puts(“输入一个字符串:“); gets(ps); while(*ps!='0') /*如果未指向字符串末尾,接着复制*/ *pt=*ps; /*将ps所指的字符赋给pt所指位置*/ ps+; pt+; *pt='0' puts(“字符串dest中的字符为:“); puts(dest); ,程序运行实例如下: 输入一个字符串: and93mn 字符串dest中的字符为: and93mn,7.5.3 用指针处理字符串数组 对于字符串数组,可以用二维字符数组来存储,那么用字符型指针数组或字符型行指针对存放在二维字符数组中的字符串进行引用也非常方便,因为二维字符数组通常是以一行为一个整体(即一个字符串)进行处理的。 7.5.4 字符指针与字符数组的比较 1存储 定义一个字符数组后,即使该数组中的元素未被赋值,系统仍然会按所定义数组的长度为数组分配存储单元。 例如:char ch20=“abcd“;,2赋值 对字符数组赋值,可以在定义的同时进行初始化,例如: char ch20=“abcde“; 也可以先定义数组,再一个元素一个元素地给数组元素赋值。 3输入 通过指针处理字符串,一定要先对指针进行初始化,使指针指向待处理字符串,然后才能进行相关处理。,7.6 指向指针的指针,指针变量也是变量,编译系统会为所定义的变量分配存储单元,要把一个指针变量的首地址存放在内存的某个存储单元中,可以定义一种指向指针变量的指针变量来实现,这种指针变量称为指向指针的指针,也称二级指针。 【例7.10】读程序,利用指向指针的指针访问变量,理解指向指针的指针是如何工作的。 void main() int a=100; int *p= ,程序运行结果如下: a=100 &a=12ff7c *p=100 p=12ff7c &p=12ff78 *pp=100 *pp=12ff7c pp=12ff78,7.7 用于动态内存分配的函数,C语言提供了以下与内存动态分配有关的库函数,使用这些函数需要用预编译指令include将头文件stdlib.h或malloc.h包含到程序中: 1malloc( )函数 函数原型:void *malloc(unsigned size); 功能:在系统中未分配的内存区域中分配一段长度为size个字节的连续内存区域,如果分配成功,函数返回一个指向该区域起始地址的指针,如果没有足够的内存可供分配,则返回空指针NULL。 2calloc( )函数 函数原型:void *calloc(unsigned n, unsigned size); 功能:在内存中分配n个长度为size字节的连续存储区域,如果分配成功则函数返回一个指向该区域起始地址的指针,否则返回空指针NULL。,3realloc( )函数 函数原型:void *realloc(void *p, unsigned size); 功能:将指针p所指向的存储空间进行重新分配,分配长度为size个字节,并将原存储区域中存放的数据复制到新分配的存储区域。如果分配成功则函数返回一个指向新存储区域的指针,否则返回空指针NULL。 4free( )函数 函数原型:void free(void *p); 功能:释放指针p指向的内存区域,该函数无返回值。,7.8 综 合 实 例,【例7.12】不使用库函数strcat( ),编写程序利用指针实现将两个从键盘输入的字符串连接生成一个新字符串,新字符串的长度刚好能容纳两个原字符串。 #include“stdio.h“ #include“string.

注意事项

本文(C语言程序设计(09763)第七章)为本站会员(E****)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.