电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

25页
  • 卖家[上传人]:E****
  • 文档编号:89351661
  • 上传时间:2019-05-23
  • 文档格式:PPT
  • 文档大小:908KB
  • / 25 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、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 指针的引用,在程序中定义了指针变量并对其赋值后,就可以使

      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 指针相减 指针相减是指对两个指针变量作减法运算,其结果是两个指针所指内存地址之间相

      3、差的存储单元个数。指针相减一般用于变量占用连续存储空间(比如数组)的情形,在其他情况下无实际意义。 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的第

      4、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的每行元素的起始地址,此时

      5、 指针数组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

      6、用字符数组处理字符串 对于一个字符串,通常是用一个一维字符数组来存放,并把一维字符数组作为一个整体(即字符串)来处理,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); ,程序运行实例如下

      7、: 请输入一个字符串: 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 用指针处理字符串数组 对于字符串数组,可以用二维字符数组来存储,那么用字符型指针数组或字符型行指针对存放在二维字符数组中的字符串进行引用也非常方便,因为二维字符数组通常是以一行为一个整体

      8、(即一个字符串)进行处理的。 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=12ff7

      9、8,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****分享,可在线阅读,更多相关《C语言程序设计(09763)第七章》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2 2022年小学体育教师学期工作总结 2022年家长会心得体会集合15篇
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.