《指针和引用》PPT课件.ppt_第1页
《指针和引用》PPT课件.ppt_第2页
《指针和引用》PPT课件.ppt_第3页
《指针和引用》PPT课件.ppt_第4页
《指针和引用》PPT课件.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

指针和引用,指针的概念,int x30,1,2; 对数组元素xi的引用,即为对 (x对应地址sizeof(int)i) 空间的值的引用 系统通过存储空间地址访问空间所存储数据。 指针,。(未知内容空间),x,用户无权限访问, 系统报错!,指针和指针变量,变量的指针: 变量的地址 指针变量: 定义一个变量,用来存放一个内存单元的地址,称为一个指针变量(简称为指针)。,指针变量的定义,格式: * 例:int *p; p是指向整型数据的指针变量,p只能存放整型数据的地址,大小为4个字节(地址总是4个字节的); 一个指针变量只能指向一种类型的变量; 未指定指针变量的值时,其值不定(静态、文件类型除外) 定义时可初始化,如 int *p=,&:用来取变量的地址,指针变量的定义,1字节,int *p=,4字节,指针变量的定义,1字节,int *p=,4字节,char *q=,float *t=,4字节,指针变量可执行的运算,赋值运算 访问(引用、输出) 算术运算 关系运算,指针变量可执行的运算之赋值运算,同类型变量起始地址赋给指针变量 int *p=,p1,指针变量可执行的运算之访问,指针(变量)名: 指针变量存放的值,为地址 *指针名: 指针变量存放的地址对应变量空间的值。(指针所指变量的值) cout“p=”pn; cout“*p=”*pn; *p1+=2; cout“*p=”*pn;,p1,C+ Programming,指针变量的赋值运算(1),【例8.2】指针的赋值运算 运行该程序,输出结果,#include void main() int a=2,b=3; int *pi1,*pi2; pi1= ,4,C+ Programming,*pi1=2 *pi2=3 pi1=0x0065FDF4 pi2=0x0065FDF0 *pi1=4 *pi2=4 pi1=0x0065FDF4 pi2=0x0065FDF4,指针只进行加减运算 自增或自减运算 指针加或减一个整数 p n的意义是p nsizeof(T),p:指针名 n:加减的整数 T:指针类型,指针变量可执行的运算之算术运算,指针只进行加减运算 自增或自减运算 指针加或减一个整数 p n的意义是p nsizeof(T) p=p+2; p+2*sizeof(int),p,指针变量可执行的运算之算术运算,指针只进行加减运算 自增或自减运算 指针加或减一个整数 p n的意义是p nsizeof(T) p=p+2; p+2*sizeof(int) cout*(p-1);,p,P-1,指针变量可执行的运算之关系运算,要求同类型的指针变量进行比较, 两个指针相同,两指针指向相同的内存单元 两个指针不同,两指针指向不同的内存单元 与0比较:表示指针变量的值是否为空。,优先级,指针运算符“*”,取地址运算符“&”,自增运算符“+”,自减运算符“-”,优先级相同,左结合。,设有: int a10=10,20,30,40,50,*p1,b; 则: p1=,C+ Programming,#include void main() int a8=10,20,30,40,50,60,70,80; int *pi; pi= /E ,运行该程序, 输出结果为: *pi=20 *pi+=10 *(pi+)=10 *+pi=20 (*pi)+=10 +*pi=12,C+ Programming,#include void main() int a8=1,2,3,4,5,6,7,8; int *pi; pi=0; if(pi = = 0) /A cout“指针pi为空!“n; for(pi= ,练习 输入两个整数分别给a和b,按先大后小的顺序输出a和b.,void main() int *p1,*p2,*p,a,b; cinab; p1= ,指针和数组,数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。 引用数组元素可以用下标法(如a3),也可以用指针法,即通过指向数组元素的指针找到所需的元素,使用指针占用内存少,运行速度快,目标程序质量高。,指针和一维数组,int a10, *p,*q; p= a、p、q都是数组a的起始地址,但是a没有空间,可视为常量,不能做自增、自减操作!,q,指针和一维数组,(1) p+i和a+i就是ai的地址,实际地址为:a+i*sizeof(int); (2) *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即ai或pi; (3) 可以对指针变量进行运算,但不允许对数组名进行运算。用指针访问数组元素时,编译程序不作下标是否越界的检查。,指针和一维数组(例),(1)执行下列语句后,*(p+2)的值为() char s= “ab”,*p; p=s; (2)具有相同类型的指针变量p和数组a,不能进行的操作是() Ap=a B. p=a0 C. p=&a0 D. p=&a1,指针和一维数组(例),(3)设有说明int i,*p= C. *p= *p+10 D. *p=i+10,指针和一维数组用指针实现排序,for(i=0;in-1;i+) for(j=i+1;jn;j+) if(ajai) t=ai; ai=aj; aj=t; ,int *p=a; for(i=0;in-1;i+) for(j=i+1;jn;j+) if(*(p+j)*(p+i) t=*(p+i); *(p+i)=*(p+j) *(p+j)=t; ,课堂练习用指针查找一维数组中的最大值,int a15=1,3,2,4,5,7,2,9,60,43, 21,23,56,34,57; int *p_max=_; for(i=1;in-1;i+) if(_ai) p_max=_; cout“max one is:”_;,指针和二维数组,二维数组的各个元素是按行连续存放的 二维数组可以看成特殊的一维数组,这个特殊的一维数组的元素又是一个一维数组。,C+ Programming,假设有如下的一个二维数组: int a43=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;,1,2,3,4,5,6,7,8,9,10,11,12,0,1,2,0,1,2,3,a,a+1,a+2,a+3,行地址,a0,a0+j,j,i,a1,a2,a3,a1+j,a2+j,a3+j,a+i,元素,*(a0+j),*(a1+j),*(a2+j),*(a3+j),ai+j,*(ai+j),*(a+i),*(a+i)+j,*(*(a+i)+j),指针和二维数组二维数组的相关地址,“*”出现在行地址前,将地址“降”为元素地址 “&”出现在元素地址前,将地址“升”为行地址 a+0和&a0等价、*(a+i)和ai等价 定义的普通指针只能指向元素空间、即只能用元素地址赋值!,课堂练习,? *(*(a+i)+j)代表什么意思 ? *”则值为9的表达式是() Ap+=3,*p+ B. p+=4, *(p+) C. p+=4,*+p D. p+=4, +*p,指针和二维数组利用指针将二维数组排序,int *p= ,指针和字符串,通常把字符串作为一个整体来使用,用指针处理字符串更加紧凑和方便,当用指针指向字符串时,并不关心存放字符串的数组的大小,只关心是否处理到字符串的结束标记。,指针和字符串,可用字符数组首地址对字符型指针赋值 直接将字符串赋给字符型指针 char *s=“I am a student!” 一旦对字符型指针赋值后,也可通过指针名直接输出字符串。couts; 对字符型指针赋值前,不允许对指针输入字符串,指针和字符串注意点,字符串不能直接赋值给字符数组,但字符串可直接赋值给字符指针 char *s ; s=“ABC” ; 字符数组的起始地址不允许改变,指针的值可以改变 不能将指针赋给数组名,可以将数组名赋给字符型指针,课堂练习,设有“char a6,*p=a;”下列表达式中正确的赋值语句是() Aa6= “Hello”; B. a= “Hello”; C. *p= “Hello”; D. p=”Hello”; 程序的输出是? void main() char *p1= “abcd”; char str50= “xyz” strcpy(str+2,p1+2); coutstrendl; ,课堂练习,void main(void) char str=“abcdca123123“; int count128,i; char *p=str; for(i=0;i127;i+) counti=0; while(*p) count*p+; for(i=0;i127;i+) if (counti) cout(char)i countiendl; ,指针数组,若干个同类型指针变量的集合,其定义形式为: 类型 *数组名数组长度说明 int a3=10,20,30; int *p3; for(int i=0;i3;i+) pi= *pi与ai等价!,指针数组,char *s4=“open”,”new”,”save”,”save as”; cout*s1ns1; ?用字符数组如何存放这四个字符串,指针数组,char s48= “open”,”new”,”save”,”save as”; 用于存储多个字符串时,字符型指针数组相对于二维字符数组大大节省了存储空间! 可利用指针数组实现 字符串的排序! P152 例8.9,指向一维数组的指针变量(行指针),int a34=1,2,3,4,5,6,7,8,9,10,11,12,*p; p=a; 是否正确?为什么 只有行指针可以用行地址赋值! int (*p)4; /p是指向四个元素空间的行地址 p=a; /a的列数必须和p数组的大小一致 p=p+1; cout(*p)2; *(*(p+i)+j)、*(pi+j)、*(*(a+i)+j)、*(ai+j) 等价!,指向指针的指针变量(多级指针),如果变量p中存放的是指针变量q的地址,那么p就指向了指针变量q,指向指针数据的指针变量,简称为指向指针的指针。 例: char *p,*q,c; q=,A,B,指针和函数之指针作参数,指针作为函数的参数时,传递给函数的是某一个变量的地址,这种情况又称为地址传递。 void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;,swap(&a,&b);,200,100,按地址传递时,函数对形参的改变将直接影响实参的值!(需要) 函数可通过指针型参数带回多个值!,指针和函数之指针作参数,数组名作参数时,作用与指针相同。,44,指针和函数之指针作返回值,返回值为指针的函数 函数可以返回值也可以不返回值,若返回值,由return语句至多只能返回一个值(可为指针),当希望函数返回多个值时,必须通过函数的参数实现。 函数返回一个指针,该指针指向一个已定义的任一类型的数据。 格式:类型 *函数名(形参表) 函数体 ,45,例:char *fun(char *s) char *t= “big”; *(t+1)=*s; return t; void main(void ) char ch= a, *p,*q; p=,指针和函数之指针作返回值,46,练习,(1)如下语句: int c45, (*cp)5; cp=c; 则以下哪个是对数组c的元素的正确引用。 Acp+1 B. *(cp+3) C. *(cp+1)+3 D. *(*cp+2) (2) void main(void) char *n4=“China”, “Japan”, “England”, “Germany”; char *p=n; int i; for(i=0;i4;i+,p+) cout*(*p+2)endl; ,47,指针和函数之函数指针,函数的指针:指一个函数的入口地址(可用函数名表示),当一个指针变量的值为函数的入口地址时,称其为指向函数的指针变量。 定义: 函数返回值的类型 (*变量名)(参数表); 例如: int (*p)(int ,int) 因函数名表示该函数的入口地址(在内存中的起始地址),可将函数名赋给指向函数的指针变量。,48,函数指针,例:int sum(int x, int y) int z; z=x+y; return z; void main(void) int a,b; int (*p)(int ,int); cinab; p=sum; coutp(a,b)(*p)(a,b); ,49,动态分配内存空间,new运算符 格式:p=new type; type要与p的类型一致,分配type类型大小的空间 p=new type(value); 将value作为分配空间的初始化值 p=new type ; 分配指定类型的数组空间 用new动态分配到的内存空间是随机值,分配不成功时返回0值表动态分配内存失败,若成功则返回所分配空间的首地址赋给指针变量。,50,动态分配内存空间,delete运算符 将动态分配的内存空间归还给系统 在程序中用new动态分配内存空间后,若没有用delete释放相应的内存空间,程序执行结束后,这部分内存空间将从系统中丢失直到重新启动计算机后进行初始化才能使用。 格式:delete pointer; 将pointer所指向的内存空间归还给系统 delete 表达式pointer; 将pointer所指向的一维数组空间还给系统,释放后不再返回任何值,不能再使用。,51,引用,引用是一种特殊的类型,定义引用型变量,本质是给一个已定义的变量起一个别名,系统不为引用类型变量分配内存空间,只是使用引用类型变量与相关联的变量使用同一个内存空间。,例: int count; int count必须是一个已定义过的变量,rec是变量count的别名,使用相同的空间。,1. 在定义引用类型的变量时,必须用同类型的已定义的变量对它初始化,不同类型的变量以及常量不可对它初始化!如:,int /错误,不可用常量初始化,引用之注意,2. 可以将引用与指针变量所指向的数据相关联,也可以将引用与数组中的元素相关联。如:,3. 可以定义指针类型的引用。,引用之注意,int *pi=new int(3); int ,int *pi=new int; int *

温馨提示

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

评论

0/150

提交评论