C语言课件:第九章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C语言课件:第九章.ppt》由用户(罗嗣辉)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课件 第九
- 资源描述:
-
1、共 84 页 第 1 1 页共 84 页 第 2 2 页1. 理解理解指针与地址的概念指针与地址的概念;2. 掌握指针的掌握指针的定义定义和运算;和运算;3. 掌握指向基本类型、数组、字符串的指掌握指向基本类型、数组、字符串的指针的针的使用使用;4.充分理解指针和数组的等价性充分理解指针和数组的等价性; ;5.掌握指针函数和函数指针的使用;掌握指针函数和函数指针的使用;6.了解指向指针的指针的概念及其使用。了解指向指针的指针的概念及其使用。共 84 页 第 3 3 页预 备 知 识内存:内存:就是内部存储器,是由存储单元组成就是内部存储器,是由存储单元组成 的。它的特点是存储单元是线性连续的。
2、它的特点是存储单元是线性连续 的。存储单元的最小单位是的。存储单元的最小单位是字节字节。 1. 内存的概念内存的概念共 84 页 第 4 4 页地址:地址:为了访问内存中的某个存储单元,我们为了访问内存中的某个存储单元,我们 要为它编号,这种编号称为要为它编号,这种编号称为内存地址内存地址。 通过地址我们就能够访问该地址所标通过地址我们就能够访问该地址所标 识的存储单元。识的存储单元。2. 地址的概念地址的概念共 84 页 第 5 5 页变量的地址:变量的地址:变量的地址是变量在内存中占用连续变量的地址是变量在内存中占用连续字节的首地址。字节的首地址。20072007存储单元共 84 页 第
3、6 6 页以往对变量的访问以往对变量的访问: : 定义变量定义变量: int: int k; k;编译系统根据类型为编译系统根据类型为k k分配内存。分配内存。 输入变量的值输入变量的值:scanf(“%d”,&k:scanf(“%d”,&k);); &k &k就代表了变就代表了变量量k k在内存中的地址。在内存中的地址。 通过变量名访问变量通过变量名访问变量, ,这种操作称为这种操作称为直接访问直接访问;b=k+5;b=k+5;通过指针间接访问通过指针间接访问: :C C提供了另一种方式,将变量提供了另一种方式,将变量 k k的地址存放在另一个的地址存放在另一个变量处变量处( (假定为假定为
4、pkpk) ),通过,通过访问访问 pkpk,就可以间接地访,就可以间接地访问变量问变量 k k,这种方式称为,这种方式称为间接访问间接访问。变量的存取方法:变量的存取方法:直接存取和间接存取。直接存取和间接存取。 共 84 页 第 7 7 页引入指针程序设计的优点引入指针程序设计的优点1. 有效表示复杂的数据结构。有效表示复杂的数据结构。2. 方便使用字符串、数组。方便使用字符串、数组。3. 可以得到多个返回值。可以得到多个返回值。4. 可以进行动态分配内存。可以进行动态分配内存。5. 程序简洁、紧凑程序简洁、紧凑, 执行效率高。执行效率高。共 84 页 第 8 8 页 9.1.1 9.1.
5、1 指针的基本概念指针的基本概念u指针指针:一个变量的地址称为该变量的指针。:一个变量的地址称为该变量的指针。u指针变量:指针变量:若一个变量专用于若一个变量专用于存放另一个变量存放另一个变量的地址(指针),的地址(指针),则称此变量为指针变量。则称此变量为指针变量。 若指针变量若指针变量p的值等于变量的值等于变量x的地址的地址, 则说指针变则说指针变量量p指向变量指向变量x。1000351000pxx的值p的值X的内存地址9.1 9.1 指针的基本概念及指针变量的定义指针的基本概念及指针变量的定义共 84 页 第 9 9 页指针的对象:指针的对象:当把变量的地址存入指针变量后,当把变量的地址
6、存入指针变量后,就可以说就可以说这个指针指向了该变量这个指针指向了该变量。 共 84 页 第 1010 页指针变量定义的一般形式:指针变量定义的一般形式: 类型标识符类型标识符 * *标识符标识符例例:float *p1;int *p2;作用:作用:定义变量为指针类型,使之专门用于存放定义变量为指针类型,使之专门用于存放地址地址。指针所指的指针所指的变量的类型变量的类型指针变量名指针变量名共 84 页 第 1111 页(1 1)* *用于定义指针变量,但指针变量名不带用于定义指针变量,但指针变量名不带* *。 如如 int int * *p1;p1; float float * *p2;p2;
7、 定义的指针变量为定义的指针变量为p1,p2 p1,p2 (2 2)一个指针变量只能指向同一类型的变量。)一个指针变量只能指向同一类型的变量。 如如 p1 p1 只能用于指向只能用于指向整型变量整型变量 p2 p2 只能用于指向只能用于指向实型变量实型变量(3 3)无论指针变量指向何种类型,指针变量本身都)无论指针变量指向何种类型,指针变量本身都是是整型整型的,指针变量本身也有自己的地址,占的,指针变量本身也有自己的地址,占两个两个字节字节的存储空间。的存储空间。 共 84 页 第 1212 页1.取地址运算取地址运算 & 格式格式: & 变量变量 设有变量说明设有变量说明 int a, b,
8、 *p, *q; p=&a; 把把a的地址赋给的地址赋给p,使,使p指向指向a q=p; 让让q也指向也指向a,使,使p、q都指向都指向a p=&b; 让让p指向指向b,使,使q指向指向a,p指向指向b 9.2 9.2 指针变量的引用和运算指针变量的引用和运算C C语言提供两种与指针有关的运算符:语言提供两种与指针有关的运算符:& & * *共 84 页 第 1313 页 2. 取内容运算取内容运算 *格式:格式: * * 指针表达式指针表达式若有变量说明:若有变量说明:intint a, a, * *p ; p ; p=&a; p=&a; 让让p p指向变量指向变量a a * *p=10;
9、p=10; 等价于等价于 a=10a=10 printf(“%d printf(“%d”, ”, * *p); p); 打印打印p p所指变量的值所指变量的值 scanf(“%dscanf(“%d”, &a); ”, &a); 给变量给变量a a输入值输入值 scanf(“%dscanf(“%d”, p); ”, p); 给变量给变量a a输入值输入值 * *p+25 p+25 等价于等价于a+25a+25设设p p是一个指针表达式,则:是一个指针表达式,则:(1 1)若)若* *p p出现在赋值号左边,表示给出现在赋值号左边,表示给p p所指变量赋值所指变量赋值(2 2)若)若* *p p不
10、出现在赋值号左边,表示不出现在赋值号左边,表示p p所指变量的值所指变量的值共 84 页 第 1414 页3. 为指针变量赋初值为指针变量赋初值 指针变量使用前必须有值指针变量使用前必须有值 指针变量的初值必须是地址值指针变量的初值必须是地址值(不能是整数不能是整数) 方法方法 :(1)在说明指针变量时同时初始化在说明指针变量时同时初始化 int a , *p = &a;(2) 使用赋值语句赋值使用赋值语句赋值 int a,*p; p =&a ; 可以为指针赋空值可以为指针赋空值(NULL),此时指针不指向任何,此时指针不指向任何 变量变量, 如如 p=NULL或或 p=0;p=0; ( p为
11、空指针为空指针)共 84 页 第 1515 页若若pa=&a pa=&a (将(将 a a 的地址送指针变量的地址送指针变量papa), , 则则 & &* *papa &( &(* *pa)pa) &(a) &(a) &a &a * *&a &a * *(&a)(&a) * *pa pa a a ( (* *pa)+ pa)+ a+ a+ * *pa+ pa+ * *(pa+) (pa+) (先取先取* *papa值,然后使值,然后使papa加加1 1) * *+pa +pa * *( (+pa+pa) ) (先使(先使papa加加1 1 ,再取,再取* *papa值)值)注意:此时pa不再
12、指向a共 84 页 第 1616 页 例例 9-1 9-1 输出变量的值。输出变量的值。 main( )main( ) int a,b; int a,b; int int * *pa, pa, * *pb; pb; a=100; b=10; a=100; b=10; pa=&a; pa=&a; pb=&b; pb=&b; printf(“%d,%dn”,a,b); printf(“%d,%dn”,a,b); printf(“%d,%dn”, printf(“%d,%dn”,* *pa,pa,* *pb);pb); 定义指针变量pa,pb将a的地址送pa将b的地址送pb输出所指向的变量运行结果为
13、100,10100,10共 84 页 第 1717 页main( ) int *p1 ,*p2 ,*p ,a ,b; scanf(“%d,%d”,&a,&b); p1=&a;p2=&b; if(a、=、 q pq p指针所指元素位于指针所指元素位于q q所指元素所指元素之后之后时为时为1 1,反之为,反之为0 0。 p p=q q=和和!=!=运算符,比较的是两个指针表达式是否指向运算符,比较的是两个指针表达式是否指向同一个内同一个内存单元存单元; ; 、= 、=,比较的是两个指针所指内存区域的比较的是两个指针所指内存区域的先后次序先后次序例:例:int a10; intint a10; in
14、t * *p=a, p=a, * *q=a+3;q=a+3;判断以下表达式的值判断以下表达式的值p=&a0 p=&a1 p=q p+4=q+2 pa+2 p=&a0 p=&a1 p=q p+4=q+2 pa+2 pq pq 共 84 页 第 2727 页5. 5. 同类指针相减同类指针相减 同类指针相减时,两个指针应该指向连续存放同类指针相减时,两个指针应该指向连续存放的同类数据区域。的同类数据区域。 语法语法 :p-qp-q 说明:说明: p-qp-q 即即p,qp,q两个指针之间数据元素的个数。两个指针之间数据元素的个数。 例如:若有例如:若有 intint a10 , a10 , * *
15、p, p, * *q;q; p=a; p=a; q=&a5; q=&a5; 则则p-qp-q=5 =5 表示表示p,qp,q之间数据元素的个数是之间数据元素的个数是5 5。 共 84 页 第 2828 页格式格式: (类型名类型名 * ) 指针表达式指针表达式功能:将指针表达式的值转换成指定类型的指针。功能:将指针表达式的值转换成指定类型的指针。 例如例如: int *p; double d, *q=&d; p=(int * )q;6. 强制类型转换运算强制类型转换运算共 84 页 第 2929 页 9.3.3 通过指针引用数组元素通过指针引用数组元素引用数组中的元素可以用以下方法:引用数组中
16、的元素可以用以下方法: 下标法下标法 : 如如 a3,ai 指针法指针法: 即通过指向数组元素的指针找到所需的元素即通过指向数组元素的指针找到所需的元素. 这种方法占内存少这种方法占内存少, 运行速度快运行速度快,程序代码质量高。程序代码质量高。 假设假设p已定义为指针变量已定义为指针变量,并已赋了一个地址并已赋了一个地址,它指向某一它指向某一个数组元素个数组元素. 且有赋值语句且有赋值语句p= &a0; 则:则: p+1 指向数组中的指向数组中的下一个元素下一个元素, a+i,p+i i ai 的地址的地址 *(a+i) , *(p+i) a+i,p+i所指向的数组元素。所指向的数组元素。
17、指向数组的指针变量也可带有下标,如指向数组的指针变量也可带有下标,如pi与与*(p+i)等等价。价。v对下标为对下标为i i的元素访问:的元素访问: ai,ai,* *(a+i),(a+i),* *(p+i),pi(p+i),pi v对对aiai的地址表示:的地址表示: & &ai,a+i,p+i,&piai,a+i,p+i,&pi 共 84 页 第 3030 页例例: 用三种方法输出数组全部元素。用三种方法输出数组全部元素。u下标法下标法:main( ) int a10, i; for(i=0;i10;i+) scanf(“%d”,&ai); printf(“n”); for(i=0;i10
18、;i+) printf(“%5d”,ai); u地址法地址法(通过数组名计算数组元素地(通过数组名计算数组元素地址)址)for(i=0;i10;i+)printf(“%5d”,*(a+i);u指针法指针法for(p=a;p(a+10);p+)printf(“%5d”,*p );共 84 页 第 3131 页main( )main( ) int int a10, a10,* *pa, i;pa, i; for (i=0;i10;i+) for (i=0;i10;i+) ai=i+1; ai=i+1; pa=a; pa=a; for(i=0;i10;i+,pa+) for(i=0;i10;i+,p
19、a+) printf(“%d printf(“%d”,”,* *pa);pa); printf(“n printf(“n”);”); 不要忘记赋初值不要忘记赋初值共 84 页 第 3232 页main( )main( ) int int a10=5,7,3,6,2,1,8,9,4,0; a10=5,7,3,6,2,1,8,9,4,0; int i, int i, * *p,maxp,max; ; p=a; p=a; max= max=* *p+;p+; for(i for(i=1; i10; i+, p+ )=1; imax ) max=pmax ) max=* *p ;p ; printf
20、( “max=%dn printf ( “max=%dn”, max); ”, max); 问题问题: :如果修改语句如果修改语句for(ifor(i=1;i10; i+ ) =1;imax) pmax) max= max=* *p+ ;p+ ;能实现程序功能吗能实现程序功能吗? ?问题问题: :如果修改语句如果修改语句for(;pfor(;pa+10; p+ ) max) pmax) max= max=* *p ;p ;能实现程序功能吗能实现程序功能吗? ?共 84 页 第 3333 页9.3.4 字符串指针与字符串字符串指针与字符串1.字符串的表示形式字符串的表示形式u 用用字符数组字符数
21、组表示,如:表示,如:main( ) char string =“I love China!”; printf(“%sn”,string);数组名数组名u 用用字符指针字符指针实现,如:实现,如:mian( ) char * string =“I love China!”; printf(“%sn”,string);把“I love China!”的首地首地址赋址赋给指针变量string共 84 页 第 3434 页2.字符指针变量与字符数组的比较字符指针变量与字符数组的比较u字符数组由若干个元素组成,每个元素中放一个字符,字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的
22、是字符串的首地址。而字符指针变量中存放的是字符串的首地址。 赋值方式:赋值方式: char str =“I am a boy!” 或或: char str20; scanf(“%s”,str);u字符指针变量指向字符串首地址。字符指针变量指向字符串首地址。赋值方法三种:赋值方法三种: (1) char *pa=“I am a boy!” (2) char *pa; pa=“I am a boy!” (3) char *pa, str20; pa=str; scanf(“%s”,pa);(注意空格的问题)(注意空格的问题)共 84 页 第 3535 页 例例9-5 9-5 已知下面程序的输出结果
23、已知下面程序的输出结果:ABCDCD,:ABCDCD,请完善请完善程序程序: : (请注意,首次执行时即将(请注意,首次执行时即将ABCDABCD全体输出全体输出,输出输出的是字符串,而非单个字符)的是字符串,而非单个字符) main()main() char char * *chpchp=“ABCD”;=“ABCD”; for( ; _A_; chp for( ; _A_; chp=chp+2)=chp+2) printf(“%s printf(“%s”, _B_);”, _B_); printf(“n printf(“n”);”); A. *chp!=0B. chp共 84 页 第 363
24、6 页作用:作用: 函数的参数不仅可以是整型、实型、字符函数的参数不仅可以是整型、实型、字符型,还可以是指针型,型,还可以是指针型,它的作用是将一个变量它的作用是将一个变量的地址传送到另的地址传送到另外外一个函数中。一个函数中。9. 4 指针与函数指针与函数9.4.1 9.4.1 指针变量作函数参数指针变量作函数参数共 84 页 第 3737 页swap(x,y)int x,y; int t; t=x; x=y; y=t;main( ) int a,b; scanf(“%d,%d”,&a,&b); if(ab) swap(a,b); printf(“%d,%dn”,a,b); 调用函数时调用函
25、数时a的值传送给的值传送给x,b值值传送给传送给y,可是执行完函数后可是执行完函数后,x和和y的值是互换了的值是互换了,但但a,b的值并的值并未互换。未互换。共 84 页 第 3838 页swap(int *p1,int *p2) int p; p=*p1; *p1=*p2; *p2=p;main( )int a,b; int *pa, *pb; scanf(“%d,%d”,&a,&b); pa=&a; pb=&b; if(ab) swap(pa,pb); pintf(“%d,%dn”,a,b); 运行情况:运行情况:5,9 9,5交换指针所指交换指针所指向的向的变量的值变量的值例:将两个数按
展开阅读全文