c语言中指针用法_第1页
c语言中指针用法_第2页
c语言中指针用法_第3页
c语言中指针用法_第4页
c语言中指针用法_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

1、整理ppt1第六章第六章 指针指针 指针是C+ 提供的一种颇具特色的数据类型,允许直接获取和操纵数据地址,实现动态存储分配。 指针是C和C+的精华所在,也是C和C+的一个十分重要的概念。 主要内容:主要内容: 指针的概念; 指针数据对象及其定义; 指针运算; 指针数据对象的引用; 整理ppt2重点:重点: 指针的概念指针的概念 利用指针实现动态存储分配(动态数组) 指针运算;指针运算; 课堂时数:课堂时数:67学时学时 内存操作函数和动态存储分配。内存操作函数和动态存储分配。上机时数:上机时数:23学时学时 课外上机时数:课外上机时数:23学时学时 整理ppt36.1 指针的概念指针的概念1.

2、 什么叫指针什么叫指针 一个数据对象的内存地址称为该数据对象的指针 。 指针可以表示各种数据对象,例如:简单变量、数组、数组元素、结构体甚至函数。 换句话说:指针具有不同的类型,可以指向不同的数据存储体。整理ppt4 int *point1,a=123,b=567; double point220; point1=&a; point1和point2都是指针; point1 a变量a的地址123 例6-1 分析下面的变量说明语句和赋值表达式: 执行point1=&a操作后,point1存放变量a的地址,它指向变量a 的存储空间。如下图所示:整理ppt5注意:指针中的内容是可以动态

3、改变的,例如point1原来指向变量a,当执行了point1 = &b操作后,即指向变量b: point2 双精度型数组的存储空间 point2数组的首地址 point1 b变量b的地址567 point2是数组名,又是指向数组第一个元素的指针,如下图所示:整理ppt62 指针的作用指针的作用(1) 实现复杂的数据结构,例如数组、链表、实现复杂的数据结构,例如数组、链表、队列和堆栈等;队列和堆栈等; (2)能方便地表示和处理字符串;)能方便地表示和处理字符串; 例如: char s120=a,b,0,*sp1; sp1=s1;/s1和sp1都代表字符串 “ab” (3) 实现动态存储分

4、配;实现动态存储分配; 对于程序中所包含的大存储量的数据对象,一般用预先定义的指针变量来表示,当实际使用时才临时申请实际的存储空间,使用完毕立即释放。整理ppt7(4) 在函数之间进行数据的双向传递。在函数之间进行数据的双向传递。 指针变量所占的内存空间与所表示的数据对象的存储空间相比实在是微乎其微,因为它只是用来存放对应空间的首地址,而不是存放数据本身,所以可以节省大量的存储空间,提高内存空间的利用率。 将形参定义成指针类型,对应的实参必须是某个数据对象的地址或首地址,也即采用传地址的方式,这样就可以实现数据的双向传递。 3指针类型指针类型 指针类型属于非标准类型,其取值是所表示的数据对象的

5、内存地址,所以其值域是内存地址集。 整理ppt8 指针类型用来定义各种类型的指针变量,例如整型指针、字符指针等等。其语法如下: * 类型标识符,是指针类型的基类型,也即指针所指向的数据对象的类型。 *,作用在各个标识符上,表示该标识符所标识的变量是指针变量。例 6-2 分析说明语句:int *a,b;。 该语句既定义了整型指针int *,同时又声明了整型指针变量a和整型变量b。 指针类型定义和指针变量声明是同时进行的。 整理ppt96.2 声明指针变量声明指针变量 1. 指针变量指针变量 用变量说明语句来声明指针变量,其语法如下:解释:解释: *,*, *; 类型标识符:用来指明指针类型的基类

6、型,可以是基本类型,例如int,char,double等等,也可以是结构类型,例如数组、结构体、文件等等。 标识符:标识指针数据对象,被标识的对象可以是基本变量、数组、结构体变量、函数等。 所谓指针变量就是类型为指针类型的变量。整理ppt102指针变量的作用域指针变量的作用域 指针变量也有全局和局部之分: 在函数外部声明的指针变量是全局的;在函数内部声明的指针变量是局部于该函数的。 3实例实例 例6-4 分析和比较语句char s1,s2100,*s3,*s4100;所声明的四种不同数据对象。int *x, *y,z; 例6-3 在函数中声明三个变量x,y,z,其中x、y是整型指针,z是整型变

7、量,对应的语句如下: 整理ppt11上面的语句定义了四个变量: 例如,执行如下的操作序列后,则s2等价于s3:s1是字符型变量,用来存放单个字符 ;s2是字符数组,最多可以存放100个字符; s3是字符型指针变量,用来存放字符数据的内存地址或字符串的首地址。如果其中存放的是字符串的首地址,则它指向一个字符串,或者说它代表一个字符串;strcpy(s2,abcd);s3=s2; s2,s3两者的关系如下图所示: 整理ppt12s2s3abcd s4是字符型指针数组,最多可以存放100个字符串的指针(地址),也即每一个元素都可能指向一个字符串,如下图所示: 整理ppt134. 指针变量的初始化指针

8、变量的初始化 可以看出,一个一维字符指针数组可以表示一个n行m列的的文本,它是特殊的二维字符数组。 我们可以在定义指针变量的同时给其赋初值,指针的初值是某个数据对象的内存地址,也即使得该指针指向对应的数据对象。 这一过程也称为建立指针。 例如: int i=10; int *iptr = &i; 整理ppt14 上面的说明语句在声明指针变量iptr的同时即赋予初值,其初值是i的地址。 也即iptr指向整型变量i,对于iptr的引用(可以表示成*iptr)也就是对i的引用。 5几点说明几点说明 (1)标识符前面的“*”并不是名称的一部分,而表示该数据对象的类型为指针类型,也即声明该数据对

9、象是指针类型数据对象。整理ppt15(2)指针变量可以和其它变量在同一语句中声明。 例如: double d1,*d2;(3)指针变量只能存放相同基类型数据对象的内存地址,换句话说,一个指针变量在任何时候都只能指向同一基类型的数据对象。 这就是所谓“指针类型与实际存储的匹配”问题 ,例如: char *c;int i; c=&i; 错误的赋值,因为c只能指向字符串。 整理ppt166.3 指针运算指针运算 指针运算实际上是地址操作,包括算术运算(加减运算)、关系运算、赋值以及取地址和间接访问等。 1指针的赋值指针的赋值 操作指针之前必须赋予确定的值,可以在定义指针的同时赋予初值,也可以

10、用赋值表达式对指针变量赋值。 例如:int grade,*p; p=&grade; (1)赋空值(NULL); (2)赋予某个变量的地址。 (3)将一个指针变量的值赋予另一指针变量。整理ppt172指针的加减运算指针的加减运算 1)运算符:)运算符:+、-、+、- 。 2)一个指针量加上(或减去)一个整型量n,表示地址偏移了n个单位,具体向上或向下偏移多少字节,取决于其基类型。 例如:例如一个整型指针变量加上4等于原存放的地址值加上8(字节);而一个双精度型指针变量加上4等于原存放的地址值加上32(字节)。 注意:参加运算的指针变量必须是已赋值的。注意:参加运算的指针变量必须是已赋值的

11、。 整理ppt183)对数组名施加)对数组名施加+,- 运算运算 数组名的初值是数组的首地址,也即指向数组的第一个元素,数组名+i,表示指向数组的第i+1个元素。 例如:ai与*(a+i)这两种表示法是等价的。 都表示a数组的第i+1个元素。整理ppt194)指针变量的)指针变量的+、-运算运算 +:原地址加上一个地址单位(基类型的实际字节数); -:原地址减去一个地址单位(基类型的实际字节数); 例如: int *iptr; iptr+;/ iptr=iptr+1,向下移动两个字节 iptr-;/ iptr=iptr-1,向上移动两个字节 下图给出指针的移动示意: 整理ppt203. 取地址

12、运算取地址运算 1) 运算符:& 2) 作用:获取数据对象的内存地址,如果是结构数据对象则获取其内存首地址。 例6-5 下面的程序段包含着对几种不同类型的数据对象的取地址运算,试分析之。 整理ppt21分析:分析: (2)取字符变量c1的内存地址赋予字符型指针变量c2,使c2指向c1。 程序段:char c1,s1100,*c2;scanf(“%c”,&c1);/(1)c2=&c1; / (2)c2=&s10; / (3) (1)scanf函数的第二个参数的类型是指针类型,调用该函数时,对应的实参必须是数据对象的实际地址或存放数据对象地址的另一指针变量。 整理p

13、pt224. 间接访问间接访问 所谓间接访问是指通过指针变量访问该变量所指向的数据对象。由于不是对数据对象的直接访问,故称为间接访问。(4)c2=s10和c2=&s1都是错误的运算,为什么? 该运算与c2=s1是等价的,为什么? (3)取字符数组s1的第1个元素的地址赋予指针变量c2,使c2指向s10。1) 运算符运算符 :* 该运算符作用在指针变量上,表示访问指针变量所指向的数据对象。 整理ppt232)作用:)作用: 实现对指针所指向的数据对象的间接访问,包括引用和赋值等基本运算。 例6-6 下面的程序段包含着对指针的间接访问。 int a,b=2,c,*p;p=&b;sc

14、anf(%d,&a);c=a+*p; 通过指针p实现对b的间接访问(引用)c=a+* pc=a+b整理ppt24(3)关于)关于“*”的说明的说明 “*”作为算术运算符,表示乘法,例如:a*b。 例6-7 下面的函数包含着对指针类型参数的间接访问。 void max(int x,int y,int *max) if (xy) *max=x;/间接赋值 else *max=y; /间接赋值; “*”作为类型标识符,用来定义指针类型(出现在数据定义部分),例如:int *p。 整理ppt255指针应用实例指针应用实例 “*”作为指针运算符,表示间接访问,例如:a+*p(p是指针变量)。 例

15、6-8 用指针表示字符串并实现字符串比较。 #include int strcmp (char *,char *);void main( ) char s1100,s2100; int ret; cin s1 s2; ret=strcmp(s1,s2); cout ret endl;整理ppt26/* strcmp *int strcmp(char *s,char *t) for (;*s=*t;s+,t+) if (*s=0) return 0; return *s-*t;整理ppt27 程序的几点说明:程序的几点说明: (1) s和t都是指针,分别指向字符数组s1和s2; (2) *s和*

16、t表示间接引用s1和s2的当前数组元素; (3) s+和t+用来改变指针值,使其指向下一 个数组元素; (4) *s-*t得到两个字符串中首次出现的不相等的字符的差值,用来决定两个字符串的大小。 整理ppt286.4 指针与数组指针与数组 我们知道数组名用来存放数组的内存首地址,也即第一个数组元素的内存地址,因此数组名是一种特殊的指针变量。 1. 数组名是指向数组元素的指针变量数组名是指向数组元素的指针变量 对于数组a而言,数组名a和a中各个元素的关系如下: a等于&a0;a+i等于&ai(参见下图)。 整理ppt292. 通过指针间接访问数组元素通过指针间接访问数组元素 这一

17、特性意味着我们可以用数组名(指针)的地址偏移来代替数组元素的下标描述。 因为数组元素的下标描述可以用数组名指针的偏移来代替,所以我们可以用指针来间接访问数组元素。例如,对于数组a,有: 当执行了aptr=a后,*aptr等于ao,*(aptr+i)等于ai。 *a等于等于a0,*(a+i)等于ai。 例6-9 试比较以下三个程序。 整理ppt30程序1void main() int a10; int i; for (i=0;i10;i+) scanf(%d,&ai); for (i=0;i10;i+) printf(%d,ai); 功能:功能: 输入输入10个整数到整型数组个整数到整型

18、数组a中,然后原样输出。中,然后原样输出。整理ppt31程序2void main() int a10; int i; for (i=0;i10;i+) scanf(%d,(a+i); for (i=0;i10;i+) printf(%d,*(a+i);功能:功能: 输入输入10个整数到整型数组个整数到整型数组a中,然后原样输出。中,然后原样输出。/ (a+i)等价于&ai/ * (a+i)等价于ai整理ppt32程序3void main()int a10;int i,*p; for (i=0;i10;i+) scanf(%d,(a+i);for (p=a;p(a+10);p+) pri

19、ntf(%d,*p);功能:功能: 输入输入10个整数到整型数组个整数到整型数组a中,然后原样输出。中,然后原样输出。/ (a+i)等价于&ai/ * p等价于ai/ p指向a数组整理ppt33结论:上面的三个程序执行结果是相同的。结论:上面的三个程序执行结果是相同的。 分析:此操作称为“复制右子串”。其处理方法如下:例6-10 设有字符串s1,将该串从第5个字符开始直至最后一个字符的右子串部分复制到s2中。(1)确定起始位置(2)将由起始字符开始的m个字符复制到s2中。问题:如何表示右子串?整理ppt34#include #include void RightString(char

20、*,char *,int); void main( ) char s1100,s2100; int n1; cin s1 n1; RightString(s1,s2,n1); cout s1= s1 s2= s2 endl;void RightString(char *s1,char *s2,int n) char *p; p=s1+n-1; strcpy(s2,p);p指向s1n-1 p表示的数组是s1的一部分整理ppt35 试问,如果没有引入p指针,本问题应如何解决? 通过上面的例子我们可以看出,用字符指针表示字符数组,在处理字符串时会显得特别灵活整理ppt363指针数组指针数组 (1)什

21、么叫指针数组)什么叫指针数组 元素的数据类型是指针的数组称为指针数组。 例如name是表格中的一个列,该列有3个单元格,分别存放3个同学的姓名,则name可以表示成字符指针数组: char *name=Lin,Ding,Zhan; 赋初值后,name数组的每一个元素的值并不是学生的姓名(字符串)而是对应字符串的首地址,也即每一个元素的值是一个字符指针,该指针指向对应的字符串(如下图所示)。整理ppt37 可以看出:name0本身是一个字符指针,它存放的是Lin的首地址,实际上可以认为name0指向一个一维字符数组,name1同样也指向一个一维字符数组,所以字符指针数组和二维字符数组有相似之处。

22、 整理ppt38(2)指向指针的指针)指向指针的指针 对于指针数组而言,其数组名是指针,而且是指向指针的指针,称为二级指针。因此除了描述成指针数组之外,还可以描述成 *类型。 执行 pname=name后,pname可以表示指针数组name。也即:pname指向name0,pname+1指向name1,依此类推。 例如:char *name=Lin,Ding,Zhan;char *pname; pname=name; 整理ppt39 分析:分析:(1)cout *pname *(pname+1);等价于: cout name0 name1 例6-11 分析下面程序的执行结果。 #include

23、 void main() char *name=Lin,Ding,Zhan; char *pname; pname=name; cout *pname *(pname+1); (2)程序执行结果:输出LinDing 整理ppt40例6-12 下面的程序将字符指针数组传递给函数,也即传递二级指针给函数。 #include void PrintString(char *,int);void main() char *pn=Fred,Barney,Wilma,Betty; int num = sizeof(pn)/sizeof(char *); PrintString(pn,num);void Pr

24、intString(char *arr,int len) for (int i=0;ilen;i+) cout (int) arri arri endl;整理ppt41分析:分析:(1)函数参数描述成二级指针*arr,对应的实参应该是二级指针或指针数组名;而对参数的引用则应描述成arri。(2)cout (int) arri是输出字符指针(字符串地址);cout arri是输出字符指针所指向的字符串。 整理ppt426.5 指针与函数指针与函数 函数和指针的关系体现在以下三方面: 函数的参数是指针类型数据,例如数组参数、指针变量参数等等。 函数返回值类型本身就是指针类型,这种函数称为指针函数。

25、 例如:char *strcpy(char *,char *) 函数名本身就是指向函数入口地址的指针,因此可以声明一种指针数据用来存放函数名,这样的指针称为函数指针。整理ppt431函数的指针类型参数函数的指针类型参数 1)形式:可以定义成指针变量或数组。 2)作用3)带有指针参数的函数的实现过程: (1)在函数的参数表中定义指针类型参数; 返回函数对指针的修改,实质上是返回函数对指针所指向的数据对象的修改,这样可以返回不止一个值,同时还可以节省大量的内存空间,因此具有很大的灵活性和实用性。 例如 :void s *x,int *y); 整理ppt44(3)函数的执行部分对指针形参进行间接访问

26、。(2)在函数调用时提供相应的变量或数组地址(传地址); 例如s); 例如,对*x和*y的操作 。 4)使用指针类型参数的副作用)使用指针类型参数的副作用 指针类型参数的灵活性体现在它使函数可以访问本函数的局部空间(栈空间)以外的内存区域,这显然破坏了函数的黑盒特性,带来以下副作用: 整理ppt45(1)可读性问题:因为对数据对象的间接访问比直接访问相对难以理解。 (2)重用性问题:函数调用依赖于上层函数或整个外部内存空间环境,丧失其封装特性(黑盒特性),所以无法作为公共模块来使用。 (3)调试的复杂性问题:跟踪错误的区域从函数的局部数据区扩大到整个内存空间,不但要跟踪变量,还要跟踪地址,错误

27、现象从简单的不能得到相应返回结果,衍生到系统环境遭破坏甚至死机。 整理ppt462指针函数指针函数 函数返回值的类型是指针类型,这样的函数称为指针函数。例如: char * strcat(char *s1,const *s2) ; 该函数返回值的数据类型是字符指针,也即该函数调用结果返回字符串s1的地址(两串连接后所形成的新串的地址)。 例6-13 分析下面程序的执行结果?整理ppt473 .函数指针函数指针#include #include main( ) char s1100,s2=aaa;cout strcpy(s1,s2);输出:aaa(1) 什么叫函数指针什么叫函数指针 程序运行时,

28、每个函数都存放在代码区中,有一个入口地址,称为函数地址,函数名就表示该地址。 指向函数地址的指针称为函数指针,通过该指针可以调用相应的函数。 整理ppt48(2)声明函数指针)声明函数指针 语法: (*)(); 例如:int (*fp)(int); fp被声明成整型函数指针,可以存放一个整型函数名。 例如:int fn1(int); . int (*fp)(int); fp=fn1; / fp被声明成函数指针/ fp被赋予fn1函数的地址整理ppt49(2) 用函数指针调用函数用函数指针调用函数语法:语法: ();或:(*)(); 例如:int fn1(int); . int (*fp)(in

29、t); fp=fn1; y=fp(5); / fp被声明成函数指针/ fp被赋予fn1函数的地址/ 用fp调用fn1函数整理ppt50#include int fn1(int);void main()int x,y;int (*fp1)(int);x=1;fp1=fn1;y=fp1(x);int fn1(int x)cout x*5;return (x*5);y=fn1(x)输出?整理ppt51(3)函数指针用作函数参数)函数指针用作函数参数 当函数形参是函数指针时,对应的实参必须是函数名,例如:实参是函数名,在函数调用时实现函数地址的传递,这样可以在被调函数体内,通过对函数指针形参的引用来调

30、用另一函数,而且对应不同的实参值可以调用不同的函数。(p179) 这就是要使用函数指针形参的原因。char f2(int (*fp1(int); f2(f1);整理ppt526.6 堆内存管理堆内存管理 允许程序运行过程中直接进行内存管理,这是C+的一大特色。 (1)程序(函数)中定义的数组,其大小事先难以确定,如果定义过大,会造成存储空间的浪费。采用即时申请内存空间的办法,不但可以动态地建立数组,而且可以保证其大小总是符合实际情况。 通过直接内存管理可以实现动态存储分配,提高内存使用率。以下几种情况尤其需要这一技术的支持: 整理ppt53 (2)函数中包含太多的数组,一旦该函数被调用,就必须

31、占据大量的栈空间。通常这些数组并不是同时使用的,这同样造成太大的浪费。 采用堆内存管理技术,可以控制程序在实际需要使用某一数据对象时才去申请数据空间,一旦用完,马上释放。 (3)程序中定义了结构体、类或其它数据对象,这样的数据对象有时需要超乎寻常的内存空间,因此更需要堆内存的支持。 整理ppt541堆内存堆内存 堆(Heap)是区别于栈区、全局数据和代码区的另一内存区域,允许用户程序运行过程中动态申请与释放。 管理堆内存的函数有:malloc、calloc、free、memcpy、memmove、memset等等。 直接操纵堆内存的操作符有:new和delete,这是C+所独有的。 下面分别讨

32、论。 整理ppt552申请堆内存申请堆内存 通过调用calloc函数、malloc函数或通过new操作符均可以为程序中的数据对象申请堆内存空间。 1)calloc函数函数 (1)格式(函数原型)格式(函数原型) void *calloc(size_t n,size_t size); 解释:解释: n:数组的长度(数组元素个数),size_t等同于unsigned long; size:数组元素的字节数,可以用sizeof来计算。 整理ppt56 函数的返回值函数的返回值 函数类型为void *,也即无符指针类型,在实际调用时,必须依据数据对象的类型进行强制转换。 例如:char *s;int

33、*a;s = (char *)calloc(10,sizeof(char); a = (int *) calloc(100,sizeof(int);将返回值转换成字符指针 ;null:申请失败 被分配的堆内存空间首地址:申请成功。 例如:sizeof (int)计算整型数据的长度。 整理ppt57 为一个具有n个元素的数组分配内存空间,每个元素的长度为size字节。 (2)功能)功能 注意: calloc函数的原型在malloc.h文件中。 凡是调用calloc申请的内存空间(由对应数据指针指向),必须调用free函数按对应数据指针进行释放。 整理ppt58例6-14 将例6-9的s1和s2两

34、个字符数组改成通过字符指针动态申请空间。#include #include #include #include void RightString(char *,char *,int);main() char *s1,*s2; int len,n1; if (s1=(char *)calloc(100,sizeof(char)=NULL) cout s1 n1; len=strlen(s1); /获取s1的实际长度 cout len= len; if (s2=(char *)calloc(len-n1+2,sizeof(char)=NULL) /len-n1+2是s2的实际长度 cout 申请不

35、到内存空间; free(s1); exit(-1); RightString(s1,s2,n1); cout s1= s1 s2= s2 endl; free(s1); free(s2); ;/释放s1所指向的内存/释放s1所指向的内存 /释放s2所指向的内存;整理ppt602)malloc函数函数 (1)格式(函数原型) void RightString(char *s1,char *s2,int n) char *p; p=s1+n-1;/p指向s1n-1,p表示的数组是s1的一部分。 strcpy(s2,p); void *malloc(size_t size); 整理ppt61解释:解

36、释: 参数size:数据对象所需内存空间的大小(字节数); 注意,如果要申请数组空间,其size的计算方法是:数组的长度(元素个数)*数组元素的长度 例如, 给例6-13中的s1申请空间,其参数描述:100*sizeof(char)。 函数类型为void *,也即无符指针类型,在实际调用时,必须依据数据对象的类型进行强制转换,转换方法与calloc函数相同。 函数的返回值 null:申请失败 被分配的堆内存空间首地址:申请成功。 整理ppt62(2)功能)功能 为指定数据对象动态分配一个size大小的内存空间,数据对象可以是一般变量、数组以及结构体变量等等。 (3)注意)注意 凡是调用mall

37、oc申请的内存空间(由对应数据指针指向),必须调用free函数按对应数据指针进行释放。 malloc函数的原型在malloc.h文件中。整理ppt63例6-15 下面的程序在堆内存中动态地建立整型数组array所需的空间,给每一个元素赋值并输出。 #include #include void main() int arraysize;/数组长度 int *array,count; cout arraysize; if (array=(int *)malloc(arraysize* sizeof(int)=NULL) cout 申请不到内存空间; 整理ppt64分析:分析: 程序通过调用mall

38、oc函数,在运行过程中动态建立array数组; else for (count=0;countarraysize;count+) arraycount = count*2; /赋值 for (count=0;countarraysize;count+) cout arraycount ; /输出 cout endl; free(array); 该数组的空间大小由arraysize*sizeof(int)动态确定(因为arraysize可以由用户输入)。 输入:10输出:0 2 4 6 8 10 12 14 16 18 整理ppt65 3)new操作符操作符 new操作符是c+专有的,用来分配堆

39、内存,其功能类似于malloc和calloc,但不同之处在于, new是操作符而不是函数,因而更为简洁和高效。 (1)格式)格式 new 解释:解释: 操作数描述为:类型名初始化值表 例如:new char为单个字符变量申请内存空间。new int10为整型数组申请内存空间。 整理ppt66例如:new char100,申请能存放100个字符的内存空间,等同于建立一个有100个元素的字符数组。 初始化值表可以指明数据个数,也可以直接给出各个数据的初始值。 new操作返回一个指针,该指针的类型与操作数中的类型名相同 。例如:new char100;返回字符类型指针。 整理ppt67(2)new操

40、作的应用实例操作的应用实例 注意:可以将返回值直接赋予同类型指针,请看下面的例子: char *s;s=new char100; /等同于s=(char *)calloc(100,sizeof(char) 例6-16 将例6-15中给array申请内存空间,改为用new操作实现。整理ppt68#include #include void main( ) int arraysize; /数组长度数组长度 int *array,count; cout arraysize; if (array=new intarraysize)=NULL) cout 申请不到内存空间申请不到内存空间; else f

41、or (count=0;countarraysize;count+) arraycount = count*2; /赋值赋值 for (count=0;countarraysize;count+) cout arraycount ; /输出输出 cout endl; deletearray; 整理ppt693释放堆内存释放堆内存 凡是调用calloc函数、malloc函数或执行new操作申请的内存空间,在函数调用结束后并不会自动释放,只能由程序自行释放,所以使用完毕或退出函数之前一定要释放。 调用calloc函数、malloc函数申请的空间,可调用free函数来释放;用new操作申请的空间则用

42、delete操作来释放。 1)free函数函数 格式:(函数原型)格式:(函数原型) void free(void *p); 整理ppt70解释:解释: 参数p,是一个无符指针,该指针指向要释放的内存空间首地址。 该函数的类型是void,故没有返回值。2)delete操作符操作符 格式格式 : delete pointer 或 delete pointer 解释解释 : pointer是delete的操作数,它是new所返回的指针。 当要释放的内存空间是分配给数组的,必须带上。 整理ppt714其它堆内存操作函数其它堆内存操作函数 下面简单地介绍其它一些比较常用的堆内存操作函数,这些函数的原型

43、也都在malloc.h文件中。 1) memcpy函数函数 格式:void *memcpy(void *dest,const void *src,size_t length); 功能:从src指向的源缓冲区中复制length个字符到dest指向的目的缓冲区中。 2) memset函数函数 格式:void *memset(void *s,int c,size_t length); 整理ppt72 格式:格式:void *memcmp(const void *s1, const void *s2, size_t length); 功能:功能:比较由s1和s2指向的两个缓冲区的内容,长度为length个字符。称为内存比较函数。 3) memcpy函数函数功能:将s指向的长度为length的缓冲区填充为字符c。称为内存填充函数 整理ppt736.7 指针的应用指针的应用 下面的程序对理解指针的应用有很大的帮助,通过程序的分析也可以帮助我们归纳本章的主要内容。 例6-16 对若干字符串按字母顺序排序后逐串输出,需要排序输出的字符串是任意的,例如若干个地址或者若干个课程名称等等。 整理ppt741)方法)方法 (1)设置一个字符指针数组,用来存放指向需要排序的字符串的指针; (2)每个字符串所需的内存空间根据

温馨提示

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

评论

0/150

提交评论