




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2指针与指针变指针与指针变 量的概念量的概念 指针变量的定义与引用指针变量的定义与引用数组的指针和指针数组的使用;数组的指针和指针数组的使用;字符串指针和指向字符串的指针变量的字符串指针和指向字符串的指针变量的使用;使用; 3预预 备备 知知 识识内存:就是内部存储器,是由存储单元组成内存:就是内部存储器,是由存储单元组成 的。它的特点是存储单元是的。它的特点是存储单元是线性连续线性连续 的。存储单元的最小单位是的。存储单元的最小单位是字节字节。 1. 内存的概念内存的概念4地址:为了访问内存中的某个存储单元,我们地址:为了访问内存中的某个存储单元,我们 要为它编号,这种编号称为要为它编号,这
2、种编号称为内存地址内存地址。 通过地址我们就能够访问该地址所标通过地址我们就能够访问该地址所标 识的存储单元。识的存储单元。2. 地址的概念地址的概念5变量的地址:变量的地址:变量在内存中总占用几个连续的变量在内存中总占用几个连续的 字节,字节,开始字节的地址开始字节的地址,就是变量的地址。,就是变量的地址。6一、指针与指针变量的概念一、指针与指针变量的概念指针:指针:一个变量的地址称为该变量的指针。一个变量的地址称为该变量的指针。指针变量指针变量:若一个变量专用于存放另一个变量:若一个变量专用于存放另一个变量 的地址(指针),则该变量称为指针变量。的地址(指针),则该变量称为指针变量。7指针
3、的对象指针的对象:当把变量的地址存入指针变量后,:当把变量的地址存入指针变量后,我们就可以说我们就可以说这个指针指向了该变量这个指针指向了该变量。 8“&”(地址运算符地址运算符) :取变量的存储地址。取变量的存储地址。“*” (指针运算符指针运算符) :是取指针所指向变量的值是取指针所指向变量的值 。 如:&a 是求变量a的地址。 *p 是p所指向的变量的值9“&”运算和运算和“*”运算是一对互逆运算。运算是一对互逆运算。 &*p &i p *&i *p i101、指针变量的定义、指针变量的定义 格式:格式: 类型标识符类型标识符 * * 指针
4、变量名指针变量名 ;如: int *p1, *p2;二、指针变量的定义与引用指明了该指针指向指明了该指针指向的内存空间所存储的内存空间所存储的数据类型。的数据类型。指向指向11在定义指针变量时要注意以下几个问题在定义指针变量时要注意以下几个问题: 变量名变量名p2前面的前面的“*”不能省略,不能省略,如果写成如果写成 int *p1, p2; 会如何?会如何? 定义中的“*”表示所定义的变量是指针变量,但指针变量名是p1、p2,而非*p1、*p2。 12指针变量只能指向定义时所规定类型的变量。指针变量只能指向定义时所规定类型的变量。 定义指针变量后,并未确定该变量指向何处。定义指针变量后,并未
5、确定该变量指向何处。在引用指针变量前必须在引用指针变量前必须首先让它指向一个变量首先让它指向一个变量,即先赋值后使用。即先赋值后使用。 13指针变量指向一个变量的格式:指针变量指向一个变量的格式: 指针变量名指针变量名=&变量名;变量名; 如:如: p=&i;14 #include stdio.h void main() int i=5; int *p; /定义指针变量p p=&i; /将 i的地址赋给p printf(%d,%d,%d,i,p,*p); 思考思考1:运行结果?:运行结果?已知已知i的地址是的地址是1245052思考思考2: p=&i可换成 *p
6、=i 或*p=&i吗? 15 #include stdio.h void main() int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&b); p1=&a; p2=&b; if (ab) p=p1;p1=p2;p2=p; printf(a=%d,b=%d,max=%d,min=%d,a,b,*p1,*p2); 16三、指针变量作为函数参数三、指针变量作为函数参数 指针可以用作函数参数,指针可以用作函数参数,将一个变量的地址传送到另一个函数中。将一个变量的地址传送到另一个函数中。这在调用函数希望改变参数的值时非常有用。这在调用函数希
7、望改变参数的值时非常有用。 17例:用指针变量编写实现两个数的交换的函数例:用指针变量编写实现两个数的交换的函数void swap(int *p1, int *p2); main() int x1=100,x2=200; printf(x1=%d,x2=%dn,x1,x2); swap(&x1,&x2); printf(x1=%d,x2=%dn,x1,x2);void swap (int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; 思考:运行结果如何?思考:运行结果如何?18 void swap(int *p1, i
8、nt *p2); main() int x1=100,x2=200; int *pp1,*pp2; pp1=&x1;pp2=&x2; printf(x1=%d,x2=%dn,x1,x2); swap(pp1,pp2); printf(x1=%d,x2=%dn,x1,x2); void swap (int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; 19图示交换过程中存储单元内容的变化:图示交换过程中存储单元内容的变化:12345620思考1:如果函数的参数不用指针而用整数,能否实现值的交换?思考2:若调用语句改为 s
9、wap(x1,x2);可否?可否? 21void swap (int *p1, int *p2) int *temp; *temp=*p1; *p1=*p2; *p2=*temp; void swap (int *p1, int *p2) int *temp; temp=p1; p1=p2; p2=temp; 思考3:若函数换成如下形式,结果如何?22void swap(int *p1, int *p2); main() int a=100,b=200; int *p01,*p02; p01=&a;p02=&b; if (ab) swap(p01,p02); printf(%d
10、,%dn,*p01,*p02);void swap (int *p1, int *p2) int *temp; temp=p1; p1=p2; p2=temp; 100,20023void main() void exchange(int *q1,int *q2,int *q3); int a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d,&a,&b,&c); p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); printf(%d,%d,%d,a,b,c); void swap(int *pt1,int
11、 *pt2) int temp;temp=*pt1;*pt1=*pt2;*pt2=temp;void exchange(int *q1,int *q2,int *q3)void swap(int *pt1,int *pt2);if(*q1*q2) swap(q1,q2);if(*q1*q3) swap(q1,q3);if(*q2*q3) swap(q2,q3);例:按大小顺序输出例:按大小顺序输出三个整数三个整数 。24指针(2)指针与指针变指针与指针变 量的概念量的概念 指针变量的定义与引用指针变量的定义与引用数组与指针数组与指针 字符串与指针字符串与指针25数组与指针数组与指针1 一维数组
12、和指针2 指针的运算3 用数组名做函数参数261 一维数组和指针 数组是连续存放的若干个元素的集合。 数组名是指向第一个元素的指针(首地址)27int a10,*p ; /定义定义思考:如何将思考:如何将p指向数组指向数组a?p=a ; /将数组将数组a的的 首地址赋给首地址赋给pp=&a0;/等价于等价于p=a28 定义指针变量时也可以赋初值 int *p=&a0;/int *p; p=&a0;或 int *p=a;/int *p; p=a;29 数组元素 的下标在 内部实现时,统一按“基地址位移”的方式处理。 a,a+1,a+i p+1/指向同一数组的下一个元素30
13、 数组数组a中第中第 i个元素的地址可表示为:个元素的地址可表示为: &ai /下标表示 p+i /指针变量,初值p=a; a+i /数组指针 数组数组a第第 i个元素的内容可表示为:个元素的内容可表示为: ai/下标表示 *(p+i)/指针变量,初值p=a; *(a+i)/数组指针31例:输出例:输出1010个元素数组中的全部元素。个元素数组中的全部元素。方法二:通过数组名计算数组元素地址,找出元素的值。方法二:通过数组名计算数组元素地址,找出元素的值。 main()main() int a10=54,65,8,2,3,56,8,21,57,98,i; int a10=54,65,8
14、,2,3,56,8,21,57,98,i; for(i=0;i10;i+) for(i=0;i10;i+) printf(%4d, printf(%4d, * *(a+i)(a+i) ); ); 方法一:下标法。方法一:下标法。 main()main() int a10=54,65,8,2,3,56,8,21,57,98, i; int a10=54,65,8,2,3,56,8,21,57,98, i; for(i=0;i10;i+) for(i=0;i10;i+) printf(%4d, printf(%4d, aiai ); ); 32方法三:用指针变量指向数组元素方法三:用指针变量指向数
15、组元素 main() int a10=54,65,8,2,3,56,8,21,57,98, *p, i; p=a; for(i=0;i10;i+) printf(%4d, *(p+i) );注注 : 以上三种方法,利用指针变量效率最高。以上三种方法,利用指针变量效率最高。 33main() int a10=54,65,8,2,3,56,8,21,57,98, *p, i;for (p=a;p(a+10);p+) printf(“%4d”, *p );/与上例有什么区别?与上例有什么区别?main() int a10=54,65,8,2,3,56,8,21,57,98, *p, i;for (p
16、=a,i=0;i10;i+,p+) printf(%4d, *p );main() int a10=54,65,8,2,3,56,8,21,57,98, *p, i;p=a;for (i=0;i10;i+) printf(%4d, *p+ );34353637说明:指针变量与数组名的区别:说明:指针变量与数组名的区别: 如: int i, *p, a6; p=&i ; /正确 a=&i ; a+; a+=i ; /错误,因为不能给常量赋值地址变量地址变量地址常量地址常量38要注意指针变量的当前值。要注意指针变量的当前值。 例如:通过指针变量输入输出例如:通过指针变量输入输出a
17、a数组元素。数组元素。main()main() int int * *p,i,a5;p,i,a5; p=a; p=a; for(i=0;i5;i+) scanf(“%6d”,p+); for(i=0;i5;i+) scanf(“%6d”,p+); /p/p最后指向数组最后指向数组a a的末尾的末尾 p=a;/p=a;/使使p p重新指向数组重新指向数组a a的首地址的首地址 for(i=0;i5;i+) for(i=0;i5;i+) printf(%2d, printf(%2d,* *p+); p+); 39小结:用指针输入和输出数组的典型格式 #include stdio.h void ma
18、in() int a3,*p,i; p=a; for (i=0;i=2;i+) scanf(%d,p+); p=a; for (i=0;i=2;i+) printf(%4d,*p+); 402 2 指针的运算指针的运算414243*p+,等价于,等价于*(p+)。*(p+)与与*(+p)作用不同。作用不同。(*p)+表示表示p所指向的元素值加所指向的元素值加1。注意:注意:*p+、*(p+)、(*p)+、*(+p)的含义的含义 4410634pa*p+、*(p+)、(*p)+、*(+p)*(-p) *(p-)的值各为多少?指针如何变化?的值各为多少?指针如何变化?45464748有问题吗?有问
19、题吗?49 如果有一个实参数组,想在函数中改变此数组的元素的值,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参都可用数组名或指针变量其对应关系有以下实参与形参都可用数组名或指针变量其对应关系有以下4 4种情况:种情况:实参与形参都用数组名;实参与形参都用数组名;实参、形参都用指针变量;实参、形参都用指针变量;实参用数组名,形参用指针变量;实参用数组名,形参用指针变量;实参为指针变量,形参用数组名。实参为指针变量,形参用数组名。注意:用指针变量作实参时一定要有确定的值。注意:用指针变量作实参时一定要有确定的值。2 2 、数组名作函数的参数、数组名作函数的参数 5051525354
20、55练习:将数组练习:将数组a的元素倒置存放在数组的元素倒置存放在数组b中。中。#include stdio.hvoid main() int a10,b10,*p,*q,i; p=a+9; q=b; for (i=0;i=9;i+) scanf(%d,a+i); for (i=0;i10;i+) *q=*p; q+; p-; q=b; for (i=0;i=q;p-) printf(%c,*p); /putchar(*p); 6263例:64#include stdio.h#include string.hint huiwen(char *p) int n=strlen(p); char *
21、q=p+n-1; while (pq) if (*p=*q) p+;q-; else return 0; return 1;void main() char *m=abcba; printf(是回文吗?是回文吗?); if (huiwen(m)=1) printf(yes!); else printf(no!) ; 65666768697071#include stdio.hvoid main()int b=3; char *fmt=“b=%dn; printf(fmt,b); 6 72#include stdio.hvoid main() int x=5,*p; p=&x; scan
22、f(%d,p); scanf(%d,&x); printf(%d,*p); printf(%d,x);#include stdio.hvoid main()char d10,*q;/char d10=apple,*q; q=apple; q=d; scanf(%s,q); scanf(%s,d); printf(%s,q); printf(%s,d);7.注意使用的区别注意使用的区别73练习练习1:输出字符串中:输出字符串中n个字符后的所有字符。个字符后的所有字符。 main() char *ps; int n,i; gets(ps); scanf(%d,&n); for (i=0;in;i+) ps+; /ps=ps+n; printf(%sn,ps); 74练习练习2、在输入的字符串中查找有无、在输入的字符串中查找有无k字符。字符。#
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房产过户居间合同协议书
- 菜店买卖合同协议书范本
- 天气单词课件
- 2025年压电致动器市场发展现状
- 电商年度市场推广策略计划方案
- 美容课程培训合同协议书
- 中国阻燃V带项目商业计划书
- 完整的融资合同协议书
- 锦福咖啡西点屋创业计划书
- 合作开名宿合同协议书
- 中考物理压强与浮力压轴题20道(解析版)
- 2024年江苏省镇江市丹阳市中考物理二模卷
- 标准吞咽功能评定量表
- MOOC 中国传统艺术-篆刻、书法、水墨画体验与欣赏-哈尔滨工业大学 中国大学慕课答案
- 风险和机遇识别、评价及控制措施表
- (新版)高级经济师《高级经济实务》(工商管理)考试题库(含答案)
- 唐宋名家词智慧树知到期末考试答案2024年
- MOOC 大学生创新创业教育-云南大学 中国大学慕课答案
- 端午节放假安全知识 主题班会课件
- 八年级历史下册期末测试题及答案
- 智能家居广告策划案
评论
0/150
提交评论