第六章 指针.ppt_第1页
第六章 指针.ppt_第2页
第六章 指针.ppt_第3页
第六章 指针.ppt_第4页
第六章 指针.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章 指针,2020/8/3,2,本讲内容,指针概念 指针的定义及使用 指针与数组 指针与函数,2020/8/3,3,复习:理解变量,内存地址 1000H,变量名 a,int a =2;,a=3;,coutaendl; cout,2,3,2020/8/3,4,6.1 指针的概念,指针变量是用来存放其他变量的地址。 指针变量,简称为指针。 指针变量是有类型的,其类型由它所指向变量的类型决定。,1000H,2020/8/3,5,6.2 指针的定义及使用,1、指针变量的定义 类型标识符 * 指针变量名 例如: int * p; int a=5; p= int x=20; coutline 1:x=

2、xendl; p= ,3、指针变量的使用,2020/8/3,8,4、使用指针变量的注意事项,指针变量内只能存放其他变量的地址,而不能直接存放一个普通数据。 一个指针变量只能指向同一个类型的变量。 一个指针变量只有先指向某一个变量后,才可利用该指针变量对它所指向的变量进行操作。 指针变量是一个变量,在内存中也占存储单元,所以指针变量也有其指针,这就是指针变量的指针。,2020/8/3,9,5、指针的运算,赋值(=) 取地址( temp=*a; *a=*b; *b=temp; void main() int x=0; int y=1; coutx=x, y=yendl; change1( ,x=0

3、,y=1,0,1,交换后: x=1,y=0,0,1,0,例6.3 :编写用于交换两个整型变量的值的函数。,2020/8/3,14,6.3 指针与数组,数组名字是这组数的起始地址,指针可以存放地址,当然可以存放数组的起始地址。 引用数组元素时是利用数组的下标进行的,也可以利用指针来进行。,2020/8/3,15,1、用指针访问一维数组,数组元素可以用下标表示,也可以用指针表示。,例如:int a5=1,2,3,4,5 下标法:ai 指针法:*(a+i),ai的地址: p=a; for(int i=0;i10;i+) cout*(p+i) ; coutendl; ,2020/8/3,16,例6.5

4、 :分析下列程序的输出结果,分析一维数组元素的指针表示。,#include int a=1,3,5,7,9; void main() int *p=a; for(int i(0);p+i=a+4;p+,i+) cout*(p+i) ; coutendl; for(p=a+4,i=0;i5;i+) coutp-i ; coutendl; ,运行结果: 1 5 9 9 7 5 3 1,2020/8/3,17,2、用指针访问二维数组,二维数组可以看成是元素是一维数组一维数组。 例如: int a34; 第1行的首地址: a+1 第1行第0列的元素地址: a1 +0或 *(a+1)+0 第1行第1列的

5、元素地址: a1+1 或 *(a+1)+1 第1行第1列的元素的值: *(a1+1)或 *(*(a+1)+1) 或a11,2020/8/3,18,例6.6:分析下列程序输出结果,理解二维数组各种表示方法。,#include int a23=1,3,5,7,9,11; void main() couta,*a,*aendl; cout ,运行结果: 0 x0042AD50,0 x0042AD50,1 0 x0042AD50,0 x0042AD50,0 x0042AD50 0 x0042AD5C,0 x0042AD5C,0 x0042AD5C 0 x0042AD5c,7,7 9,9,9,2020/

6、8/3,19,3、指针数组,如果一个数组中的元素均为指针类型的数据,则称这个数组为指针数组。 定义方式为: 类型标识符 * 数组名数组长度; 例如: int * p4 ; 指针数组比较适合于处理字符串。 例如: char *name3=“Fortran”,”BASIC” ,”Pascal”;,2020/8/3,20,例6.7 :编程实现:输入星期几的数字后,输出该数字对应 的英文全名。例如,输入3,则输出Wednesday。,#include char *name = ,Monday,Tuesday,Wednesday ,Thursday,Firday,Saturday,Sunday ; vo

7、id main() int week; while(1) coutweek; if(week7) break; coutWeekNo.weekisnameweekendl; ,请输入一个数字(07): 3 WeekNo. 3 is Wednesday,2020/8/3,21,4、指针与字符串,字符串在内存中的首地址称字符串的指针。 可以用两种方法来引用字符串: 用保存字符串的字符数组名 用指向字符串的字符(串)指针 例如: void main() char *string=”c language”; coutstring; 输出结果:c language 注意:输出时的指针变量的写法是stri

8、ng而不是*string。,2020/8/3,22,例6.8 :把一个字符串按逆序输出。,#include int strlen1(char a); void main() char s=abcdefg; char *p; int n=strlen1(s); for(p=s+n-1;p=s;p-) cout*p; coutendl; int strlen1(char a) char *p=a; int i=0; while(ai+!=0) p+; return p-a; ,2020/8/3,23,6.4 指针与函数,函数由函数名、参数、返回值等要素组成,因此指针与函数存在如下关系: 指向函数的

9、指针 指针用做函数参数 返回值为指针的函数,2020/8/3,24,1、指向函数的指针,指针变量可以指向普通变量,它也可以指向函数。 一个函数在内存中的起始地址就是该函数的指针。 函数的名称就代表了该函数的指针。 指向函数的指针变量的一般定义形式为: 数据类型标识符 (*指针变量名)( 形参表); 指向函数指针的调用格式: (*指针名) (实参表) 例如: double (*p)(double); p=sin; double z=(*p)(10);,2020/8/3,25,#include int max(int x, int y); void main() int a,b,c; cinab;

10、 c=max(a,b); couty) z=x; else z=y; return(z); ,#include int max(int x, int y); void main() int a,b,c; int (*pmax)(int, int) = max; cinab; c=pmax(a,b); couty) z=x; else z=y; return(z); ,2020/8/3,26,函数的调用可以通过函数名调用,也可通过函数指针调用。 int (*p)(int,int);只是表示定义了一个指向函数的指针变量。 在函数指针变量赋值时,只须给出函数名,不必给出参数: 如:p=max; 因为

11、只是传递函数的地址。 对指向函数的指针做象p+n, p+, p-等算术运算是无意义的。,2020/8/3,27,例6.9 :分析下列程序的输出结果,并分析指向函数指针在该程序中的用法。,void fun(double y, double (*f)(double) ) cout (*f)(y) endl; ,#include #include void main() double sin(double),cos(double),tan(double); void fun(double y,double (*f)(double); int a; couta; double x=3.1415/180

12、*a; coutsin(a)=; fun(x,sin); coutcos(a)=; fun(x,cos); couttan(a)=; fun(x,tan); ,2020/8/3,28,2、指针做函数参数,函数的参数为指针,其作用是将一个变量的地址传给被调函数的形参。实参必须是地址值,形参一定要为指针变量形式。 被调函数的形参得到的是实参的指针,该形参变量就指向实参,对形参的操作就相当于对它所指向的实参的操作。 数组与指针作为函数参数有四种情况: 函数的实参为数组名,形参为数组。 函数的实参为数组名,形参为指针变量 函数的实参为指针变量,形参为数组。 函数的实参为指针变量,形参也为指针变量。,2

13、020/8/3,29,例6.10 :编程验证主函数参数argv是用来存放命令行 参数的内容的。,#include void main(int argc,char *argv) for(int i(1);iargc;i+) cout*(argv+i) ; coutn; ,假定该程序编译后的可招待文件名为a.exe。 当执行下列命令行时: c:a prog1.cpp prog2.cpp prog3.cpp 输出结果如下: prog1.cpp prog2.cpp prog3.cpp,2020/8/3,30,3、返回指针值的函数,定义格式: 类型标识符号 *函数名(参数名) 例如: int *a (int x, int y) . . . return (指针); ,2020/8/3,31,例6.11:将表示月份的数值(112)转换顾对应的英文月份名称。,#include char *month_name(int n) char *month= Illegal month,Jannary, Februray, March,Ap

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论