




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第八章 指针,主要内容 8.1 指针和指针变量 8.2 指针与数组 8.3 字符串的指针 重点 熟练掌握指针的定义和引用;掌握用指针来处理数组;掌握用指针来处理字符。,2,预备知识,直接和间接的含义 内存 即内部存储器,是由内存单元组成 特点 存储单元的最小单位为字节 存储单元是线性连续的,3,内存 计算机的内存中的每一个字节都有一个编号 每一内存单元具有唯一的内存地址 系统为每一个已定义的变量分配一定存储空间 使变量名与内存的一个地址相对应 通过地址就能够访问该地址所标识的存储单元 程序处理过程 根据地址取出变量所对应的内存单元中存放的值 参与计算/操作 处理结果存入相应的变量名所对应的内存单元,4,高级语言中的变量具有三个属性 变量的名 变量的值 变量的地址 编程者使用c程序的一个变量 定义变量的数据类型 数据类型决定了一个变量在内存中所占用的存储空间的大小 变量在内存中总是占用几个连续的字节 定义变量名 语言的编译系统会根据变量的数据类型为该变量分配内存单元 确定变量的地址 变量的地址就是为变量分配的内存单元的起始编号 通过变量名对内存中变量对应的地址进行操作,C语言如何处理?,5,指针的概念 int a,b,c; a=10; b=20; c=a+b;,a,b,c,10,20,30,正常解释,实际情况,a,b,c,1000,2,1002,2,1004,2,10,20,10,20,30,在使用变量时总要去查表,降低了运行效率,也颇感不便。,解决方案,p,1000,这是变量a的地址,这是变量,存放的是变量a的地址指针变量。,8.1 指针和指针变量,6,指针变量的定义 一般形式为:类型符 *指针变量名; 如: int *p; int *q,*r; float a,*b; char *s1,s2; p、q、r、b、s1均为指针变量;a、s2为普通变量。 约定: 指针变量的图形表示,如:int *p; 普通变量的图形表示,如:int a;,p,a,7,指针变量的引用 两种基本的指针运算: 输出:10,10,&a,直接访问,间接访问,8,例8.1 通过指针变量存取变量的值。 main() int a,b; int *p1,*p2; printf(“a=%d,b=%dn”,a,b); printf(“*p1=%d,*p2=%dn”,*p1,*p2); ,a=10; b=20; p1=,p1=,程序1,程序2,程序3,程序4,p1=,*p1=10; *p2=20; p1=,? !,! 使用指针之前,一定要使指针有明确指向。 ! 指针变量未存储确定地址时,不能使用, 否则会造 成系统的崩溃!,9,例8.2 输入a和b两个数,按先大后小的顺序输出,a和b的值不变。 main() int a,b,*p1,*p2,*p; scanf(“%d,%d”, ,&a,&b,&a,输出:a=10,b=20,Max=20,Min=10,10,6.2 指针与数组,指针与数组的关系 一个变量有地址,一个数组元素包含若干个数组元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址,这个地址就可以用指针来实现存储。 如有: int a5; int *p,*q; p=,&a0,&a2,5,8,11,C语言规定: 数组名代表数组的首地址,也就是第一个元素a0的地址。因此: a */ 则: p+1 &a1 *(p+1) a1 p+i &ai *(p+i) ai 实际上,C语言编译 系统在处理下标变量 时,要把它转换成地 址法的形式。,p+1指向数组的下一个元素,ai *(a+i) *(p+i) pi,12,引用一个数组元素,可以用下标法或指针法。 通过数组的起始地址计算数组元素的地址,即*(a+i)或*(p+i)形式。 用指针变量处理数组元素,即p+形式: main() int a5=3,8,9,2,6,i,*p; p=a; for(i=0;i5;i+) printf(“%d “,*p); p+; ,0,输出结果: 3,1,8,2,9,3,2,4,6,5,printf(“%d “,*p+);,13,指针和数组的可替代性 C语言中的指针和数组几乎可以互换 指针可以用来完成涉及数组下标的操作 例如:int a10;int *p; 若p=&a0;或 p=a;则p就指向了数组a的首址 当p指向了一维数组a,指针对数组元素可以表示: p+n与a+n ( n(偏移量)的取值为09)表示数组元素an的地址,即&an *(p+n)和*(a+n) 表示数组元素an ( n的取值为09 ) 指向数组的指针变量也可以用数组的下标形式pn,其效果相当于*(p+n),等价于an,14,指针的运算,提示 数组名代表数组的首地址 固定的,不允许修改的 不能对数组名采用 +/-操作 指针的算术运算除了应用于数组外没有什么意义 除数组外,不能认为两个数据类型相同的变量在内存中是连续存储的 指针的运算与其基类型有关 通常情况下允许一个指针或多个指针指向同一个目标 常见错误 对不指向数组的指针进行算术运算 将不是指向同一个数组的两个指针相减或比较,这是没有意义的 指针的运算结果超出的数组的范围,15,8.3 指针与字符串,字符串的表示形式 如: char str80=“China”; char *p=str; printf(“%s”,str); printf(“%s”,p); printf(“%s”,”China”); 用%s输入/输出字符串时,只需要知道字符串的开始地址即可。 使p指向字符串的开始地址,可写成: char *p=”China”;,16,提示 赋值时,字符串的结束标志0是系统自动增加的 在输出或处理字符串指针变量和由字符数组组成的字符串时只要指出指针变量或字符数组的名字 对于其它类型的数组,不能只使用数组名输出或处理全部元素 使用指针编写的字符串处理程序比使用数组方式处理字符串的程序更简洁、更方便 在C语言中,大量使用指针对字符串进行各种处理 在处理字符串的函数中,一般都使用字符指针作为形参 在函数之间通过指针传递整个数组,在被调用函数的内部就可以用指针方式访问数组中的元素,17,例8.3 测定字符串的长度 main() char str =”abc”,*p; int len; p=str; for(len=0; *p != 0;len+)p+; printf(“%s的长度为%dn”,str,len); 运行结果:abc的长度为3 思考:,0,1,2,3,不是0,不是0,不是0,是0,for(len=0;*p;len+)p+;,printf(“%s的长度为%dn”,p,len);,for(len=0;*p+;len+);,1,2,3,不行,因为p已经指向字符串最后。,可以,因为:*p与*p!=0等价,可以,因为:*p+是先取*p指向的内容完成比较,再使p+,18,字符指针数组 例8.4将若干字符串输出 main() char *str =“Word”,”Excel”,”Outlook”; int i; for(i=0;i3;i+) printf(“%sn”,stri); ,“Word”,“Excel”,“Outlook”,19,字符指针与字符数组的讨论 占用的内存空间不同 char str80; char *p; 初始化的概念不同 char str80=“abc”; char *p=“abc”; 数组名是常量,字符指针是变量 str=str+2; /* Error */ p=str+2; /* Ok */,p,str,20,字符数组有一块确定的、连续的内存单元;而指针只有一个字的内存单元。所以: char str80,*p; scanf(“%s”,str); /* Ok */ scanf(“%s”,p); /* Error */,21,第6章 小测试,1. 以下对一维数组a的正确说明是。 A、char a(10); B、int a ; C、int k=5,ak; D、char a =a , b , c;,2. 若有说明语句:int y 4=0,0; 则下面叙述不正确的是。 A、数组y的每个元素都可得初值0 B、二维数组y的行数为1 C、该说明等价于int y 4=0; D、只有元素y00和y01可得到初值0, 其余元素均得不到初值0,22,3. 以下正确的数组定义语句是 A、char a5=1, 2, 3, 4, 5, 0; B、int b2 =1, 2; C、float c 3=1, 2, 3, 4, 5; D、char d5=“CHINA“;,4. 判断字符串str1是否大于字符串str2,应当使用 A、if (str1str2) B、if (strcmp(str1, str2) C、if (strcmp(str2, str1)0) D、if (strcmp(str1, str2)0),5. 若有语句:char s110, s210=“books”, 则能将字符串books赋给数组s1的正确语句是 A、s1=“books“; B、strcpy(s1, s2); C、s1=s2; D、strcpy(s2, s1);,23,6. 下面程序中有错误的行是 1、 main( ) 2、 3、 int x3=1; 4、 int k; 5、 sc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州省临床检验中心第十三届贵州人才博览会引才2人模拟试卷及1套完整答案详解
- 2025年枣庄市口腔医院公开招聘备案制工作人员(6人)模拟试卷及答案详解(考点梳理)
- 2025内蒙古第七批高层次人才需求目录(2025年4月29日发布)考前自测高频考点模拟试题及1套完整答案详解
- 公司与个人借款合同范本【标准】5篇
- 2025年上半年山东铁投集团校园招聘、社会公开招聘165人考前自测高频考点模拟试题参考答案详解
- 2025北京市大兴区瀛海第六幼儿园招聘模拟试卷(含答案详解)
- 2025广西石卡镇储备村(社区)“两委”后备人才152人考前自测高频考点模拟试题参考答案详解
- 2025年河北石家庄海关技术中心公开招聘劳务派遣类工作人员2名考前自测高频考点模拟试题完整答案详解
- 2025年贵溪市公安局第一批招聘警务辅助人员20人模拟试卷附答案详解(典型题)
- 2025南平国网顺昌县供电公司车辆驾驶服务项目驾驶员招聘考前自测高频考点模拟试题及一套答案详解
- 2025广西南宁上林县公安局面向社会招聘警务辅助人员50人笔试备考试题及答案解析
- 火锅店引流截流回流方案
- 2025年档案员考试试题及答案
- 2025-2026学年七年级英语上学期第一次月考 (福建专用) 2025-2026学年七年级英语上学期第一次月考 (福建专用)原卷
- 国自然培训课件
- 2025安徽普通专升本《大学语文》统考试题及答案
- 2024网络主播新职业发展报告-快手
- 2025年4月自考03450公共部门人力资源管理试题
- 辽宁省沈阳市第一二六中学教育集团2024-2025学年八年级上学期10月月考地理试题
- 2025届威海市重点中学高三下学期一模考试物理试题含解析
- 河北省定州市多校2024-2025学年七年级上学期第一次月考地理试题
评论
0/150
提交评论