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

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

《《数据类型指针》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《数据类型指针》PPT课件.ppt(34页珍藏版)》请在三一办公上搜索。

1、,第3章,数据类型_指 针,第3章 数据类型_指 针,1、指针的概念2、指针运算3、指针的限定const指针4、指针与数组(补充)5、堆内存分配(补充)6、void 指针(补充)7、指针数组(补充),指针是一种特殊的数据类型。指针概念是C+语言中较难理解和较难掌握的概念之一。本章节介绍指针的概念、定义、运算等内容。,指针变量是一种特殊的变量,变量中存放的不是某种数据类型的数据,而是另一个变量或常量的地址。,1、指针概念,如有定义:int value=150;char ch=M;并执行赋值语句:pv=/pv holds the address of value 由于pv中存放的是value变量的

2、地址,pc中存放的是ch变量的地址,故称pv和pc为指针变量。简称为指针(Pointer)。,指针指向的对象称为目标或目标变量(常量)。如图3.1所示:,value,ch,*pv,*pc,图3.1 内存空间,1000H,1050H,C+规定:目标或目标变量可以用指针变量名前加上运算符“*”表示。pv的目标变量value可表示为*pv,pc的目标变量ch可表示为*pc,即*pv和value等效*pc和ch等效 而&pv和&pc表示针变量本身的地址,(1)、指针的定义指针变量也必须先定义后使用。定义的一般格式:类型定义符*指针变量名;其中:类型定义符指针指向对象的数据类型“*”说明符,表示其后的标

3、识符是指针变 量,而不是 一般变量。,例如: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 a,bb,*c;char*p,*q,ch;指针变量也可定义为全局,静态和局部的指针。,例如:int num,*pn;char color,*pc;执行语句 pn=这里,“*”作为访问目标变量的

4、运算符,在定义指针时,“*”作为说明符。注意使用上的区别。,(2)、指针赋值,使用指针前,必须给已定义指针变量赋以指向目标变量的地址值。“&”操作符可获取变量的地址。,指针赋值的几种情况:同种数据类型的指针变量之间可以相互赋值。int a,*pa,*pb;pa=/正确,例:有关指针概念的程序#include using namespace std;void main()int icount=18;int*ptr=,结果:58 58 0 x0067fe00 0 x0067fdfc 0 x0067fe00,(3)、指针变量的地址 指针也是变量,指针变量的地址是指它本身的内存地址,如图3.1所示。,

5、图示如下:,图 3.2,(&icount),2、指针运算 指针运算实质上是地址运算。(1)、赋值运算(2)、取地址运算“则&(*ptr)表示指针ptr*(&x)表示变量x,(3)、指针与整数的加减运算在数组中,指针变量加上或减去一个整数n,表示:指针由当前所指向的位置向前或向后移动n个数据元素的位置。移动后的实际地址为:p n*sizeof(数据类型)(4)、指针的关系运算指向同种数据类型的指针可作关系运算,表示它们所存放的地址之间的关系。,=,!=,(1)、指向常量的指针 在指针定义语句的类型名前加上关键字const,表示指向的对象是常量。例如:const int a=80;const in

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

7、t ci=7,di=30;const int*const cpc=/错误,不能修改指针指向的对象值 指向常量的指针常量可表示如下:,图 7.3,4、指针与数组,C+规定定义一个数组时,用数组名存放该数组在内存中的首地址。当把数组名赋予一个指针变量后,该指针指向数组,可以通过指针移动方式访问数组元素。,例1:一维数组 int a20,*p;p=a;则下标为i 的元素可表示为:ai,*(a+i),pi,*(p+i),对应地址可表示为:&ai,a+i,&pi,p+i,注意:数组名是指针常量,不是指针变量,不能给数组名赋值。,例2:二维数组对于二维数组这种特殊的“一维数组”,前面介绍的等价关系同样实用

8、:Bij*(Bi+j)*(*(B+i)+j)当i,j之一为0或均为0时:Bi0*(Bi+0)*Bi*(B+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;,运行结

9、果为:sum is 90,例如:对于前例中数组的求和元素运算,可以有以下五种方法:#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;/方法3 for(n=0;nsize;n+

10、)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)是内存空间。堆允许用户在程序运行时(不在编译时)动态申请一定大小的内存空间。若在编程时不能确定数组的大小,或数组大小需要随程序运行而变化时,可使用堆内存,即采用动态内存分配方法。,5、堆内存分配,在

11、C语言中,在malloc.h头文件中定义有申请动态内存分配函数和释放分配内存函数,其原型为:void*malloc(size_t size);其中size_t 被定义为unsigned long,该函数功能是从内存中申请获得一个size大小的内存空间,返回指向该内存空间的首地址,若堆内存中不能提供指定大小的内存空间,则返回NULL空指针。void free(void*);函数功能为释放由malloc()函数申请获取的堆内存空间,void*为指向该空间的指针。,例如:下面程序是使用malloc和free函数的例子。#include#include#include void main()int a

12、rraysize;int*array;int count;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 a

13、rray:100 2 4 6 8 10 12 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)free(array);可改写为:if(array=new intarraysize)=NULL)delete ar

14、ray;,6、void指针 不指向任何数据类型的指针称为空类型指针,用void关键字表示。即该类型指针仅仅是一个地址。空类型指针不能进行指针运算。如前面已介绍过的动态内存分配函数为:void*malloc(size_t,size);该函数返回一个空类型指针,仅仅是获得的动态内存的起始地址。,()、定义 一个数组中若每个元素都是一个指针,则称为指针数组。例如:定义一个指针数组并初始化 char*proname=“FORTRAN”,“C”,“C+”;该数组的每个元素是指向字符串常量的字符指针,指针指向的字符串常量存放在data area 的const 存储区中,可能连续,也可能不连续。,7、指针数

15、组,该字符数组的内存表示如下:,0088:2251,F,O,R,T,R,A,N,0,C,0,C,+,+,0,0088:2252,2253,2254,2255,2256,2257,2258,2259,225A,225B,225C,0088:225D,0088:225E,Char*proname,()、指针数组与二维数组 字符指针数组与字符二维数组的主要不同之处是:字符指针数组元素指向的字符串可以是不规则的长度。字符二维数组的每个元素的长度必须相同,在定义时已确定。例如:上例中 proname08个字节字符串 proname12个字节字符串 proname24个字节字符串 总字节数为6+14=20

16、,在二维数组中:char name38=“FORTRAN”,“C”,“C+”;共需3824个字节。可见使用字符指针数组更灵活方便。,()、指向指针的指针 如果在一个指针变量中存放的是另一个变量的指针的地址,称该指针为指向指针的指针,即二重指针。例如:下图中P是二重指针,&q,&v,120,p指针,q指针,v变量,*p,*p,图 7.6,如下面定义:char*pc=“abc”,“def”,“hig”;char*ppc;/定义ppc为二重指针 ppc=pc;显然指针数组名pc 就是一个二重指针。举例:#include void main()char*pn=“Fred”,“Barney”,“Wilm

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号