版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Ch6-1第六章第六章 指针初步指针初步本章内容提要:本章内容提要:6.1 指针的概念与根本操作指针的概念与根本操作6.2 指针与一维数组指针与一维数组 6.3 字符串处置字符串处置 重点小结重点小结作业作业Ch6-26.1 指针的概念与根本操作指针的概念与根本操作6.1.1 指针的概念指针的概念1. 什么是指针?什么是指针? 指针是指针是C言语的一种数据类型,该数据类型以内存言语的一种数据类型,该数据类型以内存地址为值,并提供了相关的一系列操作。地址为值,并提供了相关的一系列操作。2. 运用指针的优点与缺陷运用指针的优点与缺陷直接访问内存,加强了高级言语的功能直接访问内存,加强了高级言语的功
2、能编程灵敏度添加编程灵敏度添加不易学习、掌握和正确平安地运用好指针不易学习、掌握和正确平安地运用好指针Ch6-36.1 指针的概念与根本操作指针的概念与根本操作(续续1)3. 指针的根本属性指针的根本属性值属性:指针值即内存地址值属性:指针值即内存地址, 它是一个非负整数它是一个非负整数(2) 对象属性:对象属性: 指该地址开场指该地址开场(指针指向指针指向)的内存单元中存放的数的内存单元中存放的数据。定义指针变量时,必需指定指针变量的对象类据。定义指针变量时,必需指定指针变量的对象类型。我们运用指针的主要目的就是经过指针访问内型。我们运用指针的主要目的就是经过指针访问内存中的数据。存中的数据
3、。如如: double p; /指针指针p的对象是一个的对象是一个double型数型数据据 /指针指针p指向一个指向一个double型数据型数据 void p; /指针指针p指向指向nothing /无值指针不能进展运算和存取操作无值指针不能进展运算和存取操作Ch6-46.1 指针的概念与根本操作指针的概念与根本操作(续续3)6.1.2 6.1.2 指针常量与变量指针常量与变量1. 1. 指针常量指针常量( (只需三种只需三种) )Ch6-56.1指针的概念与根本操作指针的概念与根本操作(续续4)2.指针变量指针变量(1)定义方法:对象类型名定义方法:对象类型名 指针变量名指针变量名;例例:
4、int p, q; double r; char s;留意:留意: 4 /VC+6.0sizeof(p)=sizeof(q)=sizeof(r)=sizeof(s)=2 /TC2.0阐明:以阐明:以VC+6.0为例,每个指针变量用于保管一个为例,每个指针变量用于保管一个32位位(4字节字节)内存地址。指针变量的存储长度与其内存地址。指针变量的存储长度与其对象类型无关。对象类型无关。Ch6-66.1指针的概念与根本操作指针的概念与根本操作(续续5)(2)指针变量的初始化指针变量的初始化 C言语允许用指针常量表达式对指针变量初始化言语允许用指针常量表达式对指针变量初始化.例例: int a4, p
5、=NULL, q=a+1; #include double ( f)(double)=sin; 留意:留意:(a) 不能将一个整数值直接作为内存地址对指针变量不能将一个整数值直接作为内存地址对指针变量进展初始化。如:进展初始化。如:long p=0 x410; Ch6-76.1指针的概念与根本操作指针的概念与根本操作(续续6)(b) 作为一种特殊情况,作为一种特殊情况,C言语允许用一个字符串常量言语允许用一个字符串常量初始化一个初始化一个char *型的指针变量型的指针变量如如: char s=ABCD; 变量变量s得到的是字符串常量第一个字符得到的是字符串常量第一个字符(字母字母A)的地的地
6、址址, 即串首地址。即串首地址。6.1.3 指针的根本运算与操作指针的根本运算与操作1. 取地址运算取地址运算: &L_value例:例:int a5, p, q, b=15; p=&a1; q=&b;Ch6-86.1指针的概念与根本操作指针的概念与根本操作(续续7)2.取对象运算:取对象运算: 指针表达式指针表达式例例1:int a=123, p; p=&a; printf(%d, p); /那么打印结果为那么打印结果为123,即变量,即变量a的值的值例例2:int a=0 x4241; char p; p=(char )&a; putchar(p);
7、 /那么打印结果为那么打印结果为A了解协助了解协助-指针、指针变量与指针对象的关系指针、指针变量与指针对象的关系Ch6-96.1指针的概念与根本操作指针的概念与根本操作(续续8)假设有定义: double p; char q; 假设指针变量p的值(即变量p保管的地址值)为0 xB8000000,表达式p表示从p保管的地址值指定的内存中取一个double型数据(即从内存地址0 xB8000000开场延续取8字节单元)。 假设q的值也是0 xB8000000, 表达式q表示从q保管的地址值指定的内存中取一个char型数据(即从内存地址0 xB8000000开场延续取1字节单元)。假设有定义:flo
8、at a=0.5f, r=&a; 假设变量a的存储地址为0 xA0000000, 那么指针变量r得到的值为0 xA0000000, 执行初始化 float r=&a;后,有 表达式r表达式a 表达式 r表达式&aCh6-106.1指针的概念与根本操作指针的概念与根本操作(续续9)3. 指针对象的有关操作指针对象的有关操作 指针对象可进展与之同类型变量的一切运算。指针对象可进展与之同类型变量的一切运算。例:例:int a,p=&a; p=15; /* 相当于相当于a=15 */ p=2; /* 相当于相当于a=a2 */ (p)+; a+; /*指针对象自加减指针
9、对象自加减1必需用小必需用小括号括号*/ 比较比较*p+ (p) ; a ; +(p); +a; (p); a; p=(p)(p); /*相当于相当于a=aa; */ scanf(%d,p); scanf(%d,&a); scanf(%d,&(p); Ch6-116.1指针的概念与根本操作指针的概念与根本操作(续续10)4.正确建立指针对象的方法正确建立指针对象的方法(1) 用已有的变量或数组空间建立对象用已有的变量或数组空间建立对象例:例:int a=15,p, q, b3; p=&a; q=&b1;(2) 用内存分配函数建立对象用内存分配函数建立对象 引见两
10、个函数:头文件均为引见两个函数:头文件均为stdlib.h 函数原形函数原形: void malloc(unsigned n) 函数功能函数功能:分配分配n字节延续内存单元供用户运用,字节延续内存单元供用户运用,分配胜利,前往首地址,分配失败,前往分配胜利,前往首地址,分配失败,前往NULL。Ch6-126.1指针的概念与根本操作指针的概念与根本操作(续续11)函数原形: free(void p)函数功能: 释放由malloc分配的内存单元。自变量p给出内存块的首地址。malloc与free函数普通配对运用(有分配就应有释放).例:double p; p=(double ) malloc(8)
11、; /分配8字节内存 p=0.5; /p所指对象存入0.5 free(void )p); /释放p所指对象 Ch6-136.1指针的概念与根本操作指针的概念与根本操作(续续12)极不平安的对象用法极不平安的对象用法: (1) double p; p=0.5; /p是指向哪里呢?是指向哪里呢?(2) double p; p=(double )malloc(4); /空间没有分配够空间没有分配够 p=0.5;(3) double p; p=(double )malloc(8); p=(double )malloc(8); /先前分配的先前分配的8字节呢?字节呢?后果:忽然死机后果:忽然死机/重启动
12、重启动/出现对话框出现对话框“程序执行了非程序执行了非法操作往往不得不手工重启动法操作往往不得不手工重启动Ch6-146.1指针的概念与根本操作指针的概念与根本操作(续续13)5.指针运算指针表达式也称为地址表达式指针运算指针表达式也称为地址表达式(1)指针加减整型表达式指针加减整型表达式n: 仍得同类型指针仍得同类型指针运算规那么:地址值增减运算规那么:地址值增减n倍对象类型长度倍对象类型长度例:例:long a=1,2,3,4,p=a; p=a+2; /*p指向元素指向元素a2, 即即p=&a2; */ p存储的地址值实践添加了存储的地址值实践添加了2sizeof(long) p+
13、; /*相当于相当于p=p+1; 即即p指向下一个对象指向下一个对象*/Ch6-156.1指针的概念与根本操作指针的概念与根本操作(续续14)特殊表达式:特殊表达式:(a) p+; 和和 p-; 先取用对象,然后先取用对象,然后p自加减自加减1(b) +p; +p; -p; -p; 这四种方式都是这四种方式都是p先自加减先自加减1,然后再取用对象,然后再取用对象对比:对比:+(p); (p)+; -(p); (p)-; 这是对象自加减这是对象自加减1Ch6-166.1指针的概念与根本操作指针的概念与根本操作(续续15)(2) 两个对象类型一样的指针进展加法运算两个对象类型一样的指针进展加法运算
14、 例:例:int p, q, s; s=p+q; /*合法但无用途合法但无用途*/ (3) 两个对象类型一样的指针进展减法运算两个对象类型一样的指针进展减法运算: 得相距的对象长度的倍数得相距的对象长度的倍数(可正可负可正可负)例:例:int a5, p, q; p=&a3; q=a+1;那么那么 pq=2而而qp= 2(4) 两个指针可以比较大小两个指针可以比较大小: 比地址值大小比地址值大小例:例:int a5, p, q; p=&a3;q=a; 那么那么pq1而而p=qp=qCh6-226.2 指针与一维数组指针与一维数组(续续3)/*下标法下标法*/#include s
15、tdio.h#define N 8void main() int aN,i ,t ; printf(Input %d integers:n,N); for(i=0;iN;i+) scanf(%d,a+i); for(i=0;iN/2;i+) t=ai;ai=aN1i;aN1i=t; for(i=0;iN;i+) printf(%6d,ai); printf(n); Ch6-236.2 指针与一维数组指针与一维数组(续续5完完)/ / 指针法指针法 / /#include stdio.h#include stdio.h#define N 8#define N 8void main()void m
16、ain() int aN, int aN,p,p,q=a+Nq=a+N1,t ;1,t ; printf(Input %d integers:n,N); printf(Input %d integers:n,N); for(p=a;p=q;p+) scanf(%d,p); for(p=a;p=q;p+) scanf(%d,p); p=a; p=a; while(pq) t= while(pq) t=p;p;p=p=q;q;q=t; p+;qq=t; p+;q; ; for(p=a;pa+N;p+) printf(%6d, for(p=a;pa+N;p+) printf(%6d,p);p); p
17、rintf(n); printf(n); Ch6-246.3 字符串处置字符串处置6.3.1 字符串的存储字符串的存储1. 内存格式内存格式 串长为串长为n的字符串在内存中延续存放,每个字符的字符串在内存中延续存放,每个字符存贮其存贮其ASCII码,占一个字节,共码,占一个字节,共n个字节,最后填一个字节,最后填一个全个全0字节作为串的终了标志。空串也有一个字节,字节作为串的终了标志。空串也有一个字节,即只需终了标志字符即只需终了标志字符0 。2. 程序中怎样存贮字符串程序中怎样存贮字符串(1) 用字符数组存贮串用字符数组存贮串: 例:例:char s=A,B,C,D,0; char s41=
18、ABCD; char s41=ABCD; char s41=A,B,C,D,0 ABCD0。SCh6-25(2) (2) 用字符串常量初始化一个字符指针变量建立串用字符串常量初始化一个字符指针变量建立串例例: char : char s=ABCD;s=ABCD; 于是于是 s0=A, s1=B, s2=C, s0=A, s1=B, s2=C, s3=D, s4=0s3=D, s4=06.3 字符串处置字符串处置(续续1)ABCD0S30103010Ch6-266.3 字符串处置字符串处置(续续2)3. 程序中不平安的字符串存储方法程序中不平安的字符串存储方法例例: (1) char s; sc
19、anf(%s, s); strcpy(s,abcd); /s指向哪里?指向哪里? (2) char s; s=(char )malloc(4); strcpy(s, abcd); /存储空间缺乏存储空间缺乏 (3) char s=abc, p=xyz; s=p; /怎样访问串怎样访问串abc?(成为内存渣滓成为内存渣滓 )Ch6-276.3 字符串处置字符串处置(续续3)6.3.2字符串的输入与输出字符串的输入与输出1. 输入字符串输入字符串 scanf(%s,串首地址串首地址); /串首地址的类型为串首地址的类型为char 以空格、以空格、TAB、回车换行为字符串的输入终了、回车换行为字符串
20、的输入终了 不能输入含有空格的字符串不能输入含有空格的字符串 gets(串首地址串首地址); /头文件头文件stdio.h 以行作为字符串的输入单位以行作为字符串的输入单位例:例:char a10;scanf(“%s,a); gets(a); 输入为:输入为:hello worlda的赋值结果有何不同的赋值结果有何不同Ch6-286.3 字符串处置字符串处置(续续4)2. 输出字符串输出字符串 printf(%s,串首地址串首地址); puts(串首地址串首地址); /头文件头文件stdio.h例如:例如:char a10;scanf(“%s,a);gets(a);printf(“%s,a);
21、puts(a);Ch6-296.3 字符串处置字符串处置(续续5)6.3.3字符串的根本操作库函数字符串的根本操作库函数 (头文件均为头文件均为string.h)1. 拷贝串拷贝串(串赋值串赋值):char strcpy(char s, char t)功能功能:t所指内存单元开场直到结尾的所指内存单元开场直到结尾的0 (包括包括0)依依次复制到地址次复制到地址s开场的内存空间。开场的内存空间。例例: char s81,t41; strcpy(t,ABCD);strcpy(s,t);puts(s); /输输出出:ABCD对比对比: char s=ABCD, t; t=s; /*地址赋值地址赋值*
22、/ t=(char )malloc(11); strcpy(t,s); /*串赋值串赋值*/Ch6-306.3 字符串处置字符串处置(续续6)2. 衔接串衔接串(串加法串加法):char strcat(char s, char t)功能功能: 串串t衔接到串衔接到串s的结尾的结尾例例: char s41=ABCD, t=EF; strcat(s,t); puts(s); /输出输出:ABCDEF3. 求串长求串长: int strlen(char s)例例: char s41=ABCD; printf(%d, strlen(s); /输出输出44. 英文字符大英文字符大/小写变换小写变换: c
23、har strupr(char s) /英文小写变大写,其他不英文小写变大写,其他不变变char strlwr(char s) /英文大写变小写,其他不变英文大写变小写,其他不变Ch6-316.3 字符串处置字符串处置(续续7)5. 两串比较大小两串比较大小:int strcmp(char s, char t)功能功能: 串串t串串s,前往正数。,前往正数。两串比较大小的方法两串比较大小的方法:对应字符比较对应字符比较ASCII码码, ASCII码码大的那么串大大的那么串大; 对应字符位置均一样对应字符位置均一样,那么串长大的串那么串长大的串大大. ABCDABC ABCDa ABCDABDC
24、 01019A8B英文字典单词的编排顺序正好是字符串的升序陈列英文字典单词的编排顺序正好是字符串的升序陈列Ch6-326.3 字符串处置字符串处置(续续8)对比:对比: 假设假设s, t均为均为char 型变量或者常量,那么型变量或者常量,那么 if(strcmp(s,t) 0) /*比较两串相等比较两串相等*/ if(s t) /*比较两指针值能否相等比较两指针值能否相等*/ if(s=t) /*能够合法但不合理能够合法但不合理*/6. 查找子串查找子串: char strstr(char s, char sub)功能:假设子串功能:假设子串sub包含于主串包含于主串s中,那么前往第一次中,
25、那么前往第一次出现的位置;假设查找失败,前往空指针出现的位置;假设查找失败,前往空指针NULL。例如,例如,char s=ABCDEFGHI,p; p=strstr(s, CDE); 那么那么p的值为的值为s+2,即,即p指向字符指向字符C。 Ch6-336.3 字符串处置字符串处置(续续9)7查找字符查找字符(1) char strchr(char s, int ch); 该函数查找字符该函数查找字符ch在字符串中第一次出现的位置,在字符串中第一次出现的位置,查找失败,前往空指针查找失败,前往空指针NULL。(2) char strrchr(char s, int ch); 该函数查找字符该
26、函数查找字符ch在字符串中最后一次出现的位在字符串中最后一次出现的位置,查找失败,前往空指针置,查找失败,前往空指针NULL。例如,例如,char s=01234500,p; p=strchr(s, 0); 那么那么p的值为的值为s,它指向最左边的,它指向最左边的字符字符0。p=strrchr(s, 0); 那么那么p的值为的值为s+7, 它指向最右边它指向最右边的字符的字符0。 Ch6-346.3.4 字符串处置程序设计举例字符串处置程序设计举例例例1不用字符串处置函数,求串长。不用字符串处置函数,求串长。#include stdio.hvoid main() char s81,p;int
27、n=0; printf(Input a string:n);gets(s); p=s;while(p) n+;p+; /* p!=0 或或 p!=0 */ printf(length=%dn, n); /*利用串终了标志为利用串终了标志为0作为循环终了条件作为循环终了条件*/字符串处置的其它典型扫描构造字符串处置的其它典型扫描构造for(p=s;p;p+) n+; /*for指针循环法指针循环法*/for(n=0;sn;n+) ; /*for下标循环法下标循环法*/6.3 字符串处置字符串处置(续续10)Ch6-356.3 字符串处置字符串处置(续续11)例例2 编程统计一个字符串小写英文字母
28、的数目。编程统计一个字符串小写英文字母的数目。#include stdio.hvoid main() char s81,k;int n=0; printf(Input a string:n);gets(s); for(k=0;sk;k+) if(sk=a&sk=z) n+; printf(n=%dn,n); 常 见 错 误 :常 见 错 误 : f o r ( k = 0 ; k =a&sk=z) n+; 应该利用串终了标志字节应该利用串终了标志字节0作为循环退作为循环退出条件出条件Ch6-366.3 字符串处置字符串处置(续续12)例例3 不用字符串处置库函数,编程实现字符串
29、拷贝。不用字符串处置库函数,编程实现字符串拷贝。 #include stdio.h /源程序源程序1void main() char s41,t41,i=0; / 串串t复制到串复制到串s / gets(t); while(si=ti)i+; puts(s); void main() /源程序源程序2 char p,q,s41,t41; / 串串t复制到串复制到串s / gets(t); for(p=s,q=t;q!=0;) p+=q+; puts(s); 问题与思索:问题与思索:源程序源程序2的缺陷是什么?的缺陷是什么?Ch6-376.3 字符串处置字符串处置(续续13)例例5 输入一句英文,按单词分行输出。输入一句英文,按单词分行输出。例如,假设程序的输入是例如,假
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026 年土地保护从我做起科普教育课件
- 铝加工厂原材料管控准则
- 某船舶厂船舶建造安全规范
- 某化肥厂环境保护细则
- 年产100吨5-HS、300吨JFMF医药中间体技改项目可行性研究报告模板-立项备案
- 某玻璃厂熔融操作规程
- 胎动管理专家共识2025
- 历史选择题解题技巧
- 大学计算机数据表示和逻辑基础
- 医学学科竞赛培训==神经内科
- 2026年恢复驾驶资格考试题库含答案详解(培优)
- 2025QECon全球软件质量效能大会:AI助力的资损防控体系化解决方案
- 居家安宁疗护培训
- DB34∕T 5318-2025 养老机构分级护理服务规范
- 2026年少先队大队委员选拔考核核心考点专项突破练习题及解答
- 2026贵州大数据产业集团有限公司第一次招聘155人参考笔试题库及答案解析
- 雨课堂学堂在线学堂云《古代汉语-文选(西外院)》单元测试考核答案
- T-CSPSTC 100-2022 混凝土智能振捣施工技术规程
- 泌尿外科前列腺癌术后康复训练指南
- 闪测影像测量仪校准规范
- 2025年广东英语春考真题及答案
评论
0/150
提交评论