《数据类型指针》PPT课件.ppt

上传人:wuy****n92 文档编号:71669625 上传时间:2023-02-04 格式:PPT 页数:34 大小:309.49KB
返回 下载 相关 举报
《数据类型指针》PPT课件.ppt_第1页
第1页 / 共34页
《数据类型指针》PPT课件.ppt_第2页
第2页 / 共34页
点击查看更多>>
资源描述

《《数据类型指针》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《数据类型指针》PPT课件.ppt(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第3章 数据类型_指 针第3章 数据类型_指 针1、指针的概念2、指针运算3、指针的限定const指针4、指针与数组(补充)5、堆内存分配(补充)6、void 指针(补充)7、指针数组(补充)指针是一种特殊的数据类型。指针是一种特殊的数据类型。指针是一种特殊的数据类型。指针是一种特殊的数据类型。指针概念是指针概念是指针概念是指针概念是C+C+语言中较难理解和较难掌握的概念之一。语言中较难理解和较难掌握的概念之一。语言中较难理解和较难掌握的概念之一。语言中较难理解和较难掌握的概念之一。本章节介绍指针的概念、定义、运算等内容。本章节介绍指针的概念、定义、运算等内容。本章节介绍指针的概念、定义、运算

2、等内容。本章节介绍指针的概念、定义、运算等内容。指针变量是一种特殊的变量,变量中存放的不是某种数指针变量是一种特殊的变量,变量中存放的不是某种数指针变量是一种特殊的变量,变量中存放的不是某种数指针变量是一种特殊的变量,变量中存放的不是某种数据类型的数据,而是另一个变量或常量的地址。据类型的数据,而是另一个变量或常量的地址。据类型的数据,而是另一个变量或常量的地址。据类型的数据,而是另一个变量或常量的地址。11、指针概念指针概念 如有定义:如有定义:int value=150;char ch=M;并执行赋值语句:并执行赋值语句:并执行赋值语句:并执行赋值语句:pv=&value;pc=&ch;/

3、pv holds the address of value 由于由于pv中存放的是中存放的是value变量的地址,变量的地址,pc中存放的是中存放的是ch变量变量的地址,故称的地址,故称pv和和pc为指针变量。简称为指针(为指针变量。简称为指针(Pointer)。)。指针指向的对象称为目标或目标变量(常量)。如图指针指向的对象称为目标或目标变量(常量)。如图3.1所示:所示:150 M valuechpvpc*pv*pc图3.1 内存空间1000H1050H 0000H&value 1000H 1001H&ch 1050H&pc 11A2H 11A3H 11A1H&pv 11A0HC+规定:规

4、定:n 目标或目标变量可以用指针变量名前加上运算符目标或目标变量可以用指针变量名前加上运算符“*”表示。表示。pv的目标变量的目标变量value可表示为可表示为*pv,pc的目标变量的目标变量ch可表示为可表示为*pc,即即 *pv和和value等效等效 *pc和和ch等效等效 而而&pv和和&pc表示针变量本身的地址表示针变量本身的地址(1)、指针的定义、指针的定义指针变量也必须先定义后使用。定义的一般格式:指针变量也必须先定义后使用。定义的一般格式:类型定义符类型定义符 *指针变量名指针变量名;其中:类型定义符其中:类型定义符指针指向对象的数据类型指针指向对象的数据类型 “*”说明符,表示

5、其后的标识符是指针变说明符,表示其后的标识符是指针变 量,而不是量,而不是 一般变量。一般变量。例如:例如:int *ptr;char *name;float *pf;其中,定义其中,定义ptr,name,pf分别为指向整型、字符型和浮点型分别为指向整型、字符型和浮点型数据的指针。数据的指针。const int *ptr;/pointer to int const const char *cpc const float *point其中,其中,ptr,cpc,point为指向常量的指针。为指向常量的指针。注意:注意:指针变量可以与其他变量一起定义,如:指针变量可以与其他变量一起定义,如:int

6、 a,bb,*c;char *p,*q,ch;指针变量也可定义为全局,静态和局部的指针。指针变量也可定义为全局,静态和局部的指针。例如:例如:int num,*pn;char color,*pc;执行语句执行语句 pn=#pc=&color;则在程序中则在程序中 *pn=100;等效于等效于num=100;*pc=r;等效于等效于color=r;这里,这里,“*”作为访问目标变量的运算符,在定义指针时,作为访问目标变量的运算符,在定义指针时,“*”作为说明符。注意使用上的区别。作为说明符。注意使用上的区别。(2)、指针赋值、指针赋值 使用指针前,必须给已定义指针变量赋以指向目标变量的使

7、用指针前,必须给已定义指针变量赋以指向目标变量的地址值。地址值。“&”操作符可获取变量的地址。操作符可获取变量的地址。指针赋值的几种情况:指针赋值的几种情况:指针赋值的几种情况:指针赋值的几种情况:同种数据类型的指针变量之间可以相互赋值。同种数据类型的指针变量之间可以相互赋值。int a,*pa,*pb;pa=&a;pb=pa;/pa,pb holds the same address of a指针变量可以赋初值:指针变量可以赋初值:int a,b,c;int *pa=&a,*pc=&c;指针可初始化为空指针指针可初始化为空指针 char *p=NULL;指针变量的类型名与指向目标的数据类型一

8、致。指针变量的类型名与指向目标的数据类型一致。例如:例如:int *p,a;float b,*q;p=&b;q=&a;/错误错误 p=&a;q=&b;/正确正确例:有关指针概念的程序例:有关指针概念的程序#include using namespace std;void main()int icount=18;int *ptr=&icount;*ptr=58;couticountendl;coutptrendl;cout&icountendl;cout*ptrendl;cout&ptrendl;结果:结果:58 58 0 x0067fe00 0 x0067fdfc 0 x0067fe00(3)

9、、指针变量的地址、指针变量的地址 指针也是变量,指针变量的地址是指它本身的内存地址,指针也是变量,指针变量的地址是指它本身的内存地址,如如图图3.1所示。所示。150 M 1000H1050Hvaluechpvpc*pv*pc0000H&value 1000H1001H&ch 1050H 11A1H&pv 11A0H&pc 11A2H11A3H图示如下:图示如下:0067:FE00(&icount)58ptricount0067:FE00*ptr0067:FDFC (&ptr)图 3.2(&icount)2、指针运算指针运算 指针运算实质上是地址运算。指针运算实质上是地址运算。(1)、赋值运算

10、、赋值运算 (2)、取地址运算、取地址运算“&”(address of)和取内容运算)和取内容运算“*”(Dereference),),“&”和和“*”互为逆运算互为逆运算 例如:例如:int x,*ptr=&x;则则&(*ptr)表示指针表示指针ptr *(&x)表示变量表示变量x(3)、指针与整数的加减运算、指针与整数的加减运算在数组中,指针变量加上或减去一个整数在数组中,指针变量加上或减去一个整数n,表示:,表示:指针由当前所指向的位置向前或向后移动指针由当前所指向的位置向前或向后移动n个数据元素的位置。个数据元素的位置。移动后的实际地址为:移动后的实际地址为:p n*sizeof(数据

11、类型数据类型)(4)、指针的关系运算、指针的关系运算指向同种数据类型的指针可作关系运算,表示它们所存放的指向同种数据类型的指针可作关系运算,表示它们所存放的地址之间的关系。地址之间的关系。,=,!=(1)(1)、指向常量的指针、指向常量的指针、指向常量的指针、指向常量的指针 在指针定义语句的类型名前加上关键字在指针定义语句的类型名前加上关键字const,表示指向的对象是常量。,表示指向的对象是常量。例如:例如:const int a=80;const int b=15;const int*pi=&a;/定义定义pi 为指向常量的指针为指向常量的指针 *pi=93;/错误,不能修改指向的常量错误

12、,不能修改指向的常量 pi=&b;/正确,指向另一个常量正确,指向另一个常量 注意:实际上常量指针是可以指向变量的,但这时候我们不能通过常量指注意:实际上常量指针是可以指向变量的,但这时候我们不能通过常量指针来修改变量的内容,但可以通过变量本身来改变其值。针来修改变量的内容,但可以通过变量本身来改变其值。(2)(2)、指针常量指针常量指针常量指针常量 定义指针时,在指针名前加上定义指针时,在指针名前加上const 关键字,表示指针本身是常量。必关键字,表示指针本身是常量。必须在定义时进行初始化。例如:须在定义时进行初始化。例如:char*const pc=“asdf”;pc=“dfgh”;/错

13、误,不能修改指针常量中的地址错误,不能修改指针常量中的地址 *pc=b;/正确,内容被修改为正确,内容被修改为“bsdf”(3)(3)、指向常量的指针常量、指向常量的指针常量、指向常量的指针常量、指向常量的指针常量 定义指针时,在类型名及指针名前加上定义指针时,在类型名及指针名前加上const 关键字,表示指向常量的指关键字,表示指向常量的指针常量。必须在定义时进行初始化。针常量。必须在定义时进行初始化。33、const const 指针指针 const int ci=7,di=30;const int*const cpc=&ci;const int*const cpd=&di;cpd=&ci

14、;/错误,指针值不能被修改错误,指针值不能被修改 *cpd=50;/错误,不能修改指针指向的对象值错误,不能修改指针指向的对象值 指向常量的指针常量可表示如下:指向常量的指针常量可表示如下:0067:PD660067:P600300067:P600指针常量指针常量CPD常量常量di图 7.3 4 4、指针与数组指针与数组 C+规定定义一个数组时,用数组名存放该数组在内存规定定义一个数组时,用数组名存放该数组在内存中的首地址。中的首地址。当把数组名赋予一个指针变量后,该指针指向数组,当把数组名赋予一个指针变量后,该指针指向数组,可以通过指针移动方式访问数组元素。可以通过指针移动方式访问数组元素。

15、例例1:一维数组:一维数组 int a20,*p;p=a;则下标为则下标为i 的元素可表示为:的元素可表示为:ai,*(a+i),pi,*(p+i),对应地址可表示为:对应地址可表示为:&ai,a+i,&pi,p+i注意:注意:数组名是指针常量,数组名是指针常量,不是指针变量,不能给数不是指针变量,不能给数组名赋值。组名赋值。例例2:二维数组:二维数组对于二维数组这种特殊的对于二维数组这种特殊的“一维数组一维数组”,前面介,前面介绍的等价关系同样实用:绍的等价关系同样实用:Bij *(Bi+j)*(*(B+i)+j)当当i,j之一为之一为0或均为或均为0时:时:Bi0*(Bi+0)*Bi*(B

16、+i)B0j(*(B+0)j(*B)j*(*B+j)B00*(B0+0)*B0*(B+0)*B 例如:下面程序是用指针方式访问数组元素,计算数组元素之和。例如:下面程序是用指针方式访问数组元素,计算数组元素之和。#include using namespace std;void main()int iarray10=0,2,4,6,8,10,12,14,16,18;int sum=0;int*iptr=iarray;/指针初始化指针初始化 for(int i=0;i10;i+)sum+=*iptr;iptr+;cout“sum is“sumendl;运行结果为:运行结果为:sum is 90例

17、如:对于前例中数组的求和元素运算,可以有以下五种方法:例如:对于前例中数组的求和元素运算,可以有以下五种方法:#include int sum1,sum2,sum3,sum4,sum5;int iarray=1,4,2,7,13,32,21,48,16,30;int*iptr;void main()int size,n;size=sizeof(iarray)/sizeof(*iarray);for(n=0;nsize;n+)/方法方法1 sum1+=iarrayn;iptr=iarray;/方法方法2 for(n=0;nsize;n+)sum2+=*iptr+;iptr=iarray;/方法方

18、法3 for(n=0;nsize;n+)sum3+=*(iptr+n);iptr=iarray;/方法方法4 for(n=0;nsize;n+)sum4+=iptrn;for(n=0;nsize;n+)/方法方法5 sum5+=*(iarray+n);coutsum1endl;coutsum2endl;coutsum3endl;coutsum4endl;coutsum5endl;答案为:答案为:174 174 174 174 174 堆堆(heap)是内存空间。是内存空间。堆允许用户在程序运行时堆允许用户在程序运行时(不在编译时不在编译时)动态申请一定动态申请一定大小的内存空间。大小的内存空间

19、。若在编程时不能确定数组的大小,或数组大小需要随若在编程时不能确定数组的大小,或数组大小需要随程序运行而变化时,可使用堆内存,即采用动态内存分配程序运行而变化时,可使用堆内存,即采用动态内存分配方法。方法。55、堆内存分配堆内存分配 在在C语言中,在语言中,在malloc.h头文件中定义有申请动态内存头文件中定义有申请动态内存分配函数和释放分配内存函数,其原型为:分配函数和释放分配内存函数,其原型为:void*malloc(size_t size);其中其中size_t 被定义为被定义为unsigned long,该函数功能是从内,该函数功能是从内存中申请获得一个存中申请获得一个size大小的

20、内存空间,返回指向该内存空大小的内存空间,返回指向该内存空间的首地址,若堆内存中不能提供指定大小的内存空间,间的首地址,若堆内存中不能提供指定大小的内存空间,则返回则返回NULL空指针。空指针。void free(void*);函数功能为释放由函数功能为释放由malloc()函数申请获取的堆内存空函数申请获取的堆内存空间,间,void*为指向该空间的指针。为指向该空间的指针。例如:下面程序是使用例如:下面程序是使用malloc和和free函数的例子。函数的例子。#include#include#include void main()int arraysize;int*array;int cou

21、nt;coutarraysize;if(array=(int*)malloc(arraysize*sizeof(int)=NULL)coutCant allocate more memory,terminating.n;exit(1);for(count=0;countarraysize;count+)arraycount=count*2;for(count=0;countarraysize;count+)coutarraycount ;coutendl;free(array);运行结果:运行结果:Please input a number of array:100 2 4 6 8 10 12

22、 14 16 18 C+中设有中设有new和和delete两个专用操作符,具有类似于两个专用操作符,具有类似于malloc和和free函数的功能。函数的功能。new 的使用格式:的使用格式:new;其中:其中:的值为所创建的数组大小,的值为所创建的数组大小,例如:例如:float*p;p=new float10;delete的使用格式:的使用格式:delete;其中,指针名是由其中,指针名是由 new 操作符返回的指针,例如:操作符返回的指针,例如:delete p;上例的两条语句:上例的两条语句:if(array=(int*)malloc(arraysize*sizeof(int)=NULL

23、)free(array);可改写为:可改写为:if(array=new intarraysize)=NULL)delete array;6 6、voidvoid指针指针 不指向任何数据类型的指针称为空类型指不指向任何数据类型的指针称为空类型指针,用针,用void关键字表示。即该类型指针仅仅关键字表示。即该类型指针仅仅是一个地址。是一个地址。空类型指针不能进行指针运算。如前面已空类型指针不能进行指针运算。如前面已介绍过的动态内存分配函数为:介绍过的动态内存分配函数为:void*malloc(size_t,size);该函数返回一个空类型指针,仅仅是获得该函数返回一个空类型指针,仅仅是获得的动态内

24、存的起始地址。的动态内存的起始地址。()、定义、定义、定义、定义 一个数组中若每个元素都是一个指针,则称为指针数组。一个数组中若每个元素都是一个指针,则称为指针数组。例如:定义一个指针数组并初始化例如:定义一个指针数组并初始化 char*proname=“FORTRAN”,“C”,“C+”;该数组的每个元素是指向字符串常量的字符指针,指针指该数组的每个元素是指向字符串常量的字符指针,指针指向的字符串常量存放在向的字符串常量存放在data area 的的const 存储区中,可能连续,存储区中,可能连续,也可能不连续。也可能不连续。77、指针数组指针数组该字符数组的内存表示如下:该字符数组的内存

25、表示如下:0088:22510088:22590088:225B0067:44000067:44020067:44040088:2251FORTRAN0C0C+00088:22522253225422552256225722582259225A225B225C0088:225D0088:225EChar*proname()、指针数组与二维数组、指针数组与二维数组、指针数组与二维数组、指针数组与二维数组 字符指针数组与字符二维数组的主要不同之处是:字符指字符指针数组与字符二维数组的主要不同之处是:字符指针数组元素指向的字符串可以是不规则的长度。针数组元素指向的字符串可以是不规则的长度。字符二维数

26、组的每个元素的长度必须相同,在定义时已确字符二维数组的每个元素的长度必须相同,在定义时已确定。例如:上例中定。例如:上例中 proname08个字节字符串个字节字符串 proname12个字节字符串个字节字符串 proname24个字节字符串个字节字符串 总字节数为总字节数为6+14=20在二维数组中:在二维数组中:char name38=“FORTRAN”,“C”,“C+”;共需共需3824个字节。个字节。可见使用字符指针数组更灵活方便。可见使用字符指针数组更灵活方便。()、指向指针的指针、指向指针的指针、指向指针的指针、指向指针的指针 如果在一个指针变量中存放的是另一个变量的指针的地址,如

27、果在一个指针变量中存放的是另一个变量的指针的地址,称该指针为指向指针的指针,即二重指针。称该指针为指向指针的指针,即二重指针。例如:下图中例如:下图中P是二重指针是二重指针&q&v120p指针指针q指针指针v变量变量*p*p图 7.6如下面定义:如下面定义:char*pc=“abc”,“def”,“hig”;char*ppc;/定义定义ppc为二重指针为二重指针 ppc=pc;显然指针数组名显然指针数组名pc 就是一个二重指针。就是一个二重指针。举例:举例:#include void main()char*pn=“Fred”,“Barney”,“Wilma”,“Betty”;int num=s

28、izeof(pn)/sizeof(char*);/求数组元素个数求数组元素个数(8/2)for(int i=0;inum;i+)cout(int)pni“”/输出字符串地址输出字符串地址 pniendl;/输出字符串输出字符串 结果为:结果为:4202628 Fred4202633 Barney4202640 Wilma4202646 Betty 指针是特殊变量,其内容存放的是另一变量指针是特殊变量,其内容存放的是另一变量指针是特殊变量,其内容存放的是另一变量指针是特殊变量,其内容存放的是另一变量的地址,而不是数据。的地址,而不是数据。的地址,而不是数据。的地址,而不是数据。指针数组是指针数组是指针数组是指针数组是C+C+C+C+程序中最有用的结构之一。程序中最有用的结构之一。程序中最有用的结构之一。程序中最有用的结构之一。其成员为指针。其成员为指针。其成员为指针。其成员为指针。堆堆允允许许程程序序在在运运行行时时,而而不不是是在在编编译译时时,确确定定所所申申请请内内存存之之大大小小。在在C+C+中中,堆堆分分配配一一般般用用 new new 和和delete delete 两两个个操操作作符符,而而在在C C语语言言中中使使用用的的mallocmalloc()()和和free()free()函数则相对使用较少。函数则相对使用较少。数组小节数组小节

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁