指针引用与动态内存分配.ppt_第1页
指针引用与动态内存分配.ppt_第2页
指针引用与动态内存分配.ppt_第3页
指针引用与动态内存分配.ppt_第4页
指针引用与动态内存分配.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、1,6.1 选择排序算法,实现功能: 将数组list中的n个数按照从大到小的顺序排好之后再输出它们(此n个数通过使用函数rand来自动产生)。,程序见p6_1.cpp,2,6.2 指针类型,6.2.1 指针变量说明,指针类型的变量说明格式为: 类型名*指针变量名=初值; 例如: int i=3; int *pi; /pi为int*型变量,其取值为一个int型变量的地址, /也称pi为指向int型数据的指针变量(简称指针),3,pi = ),4,说明: 类型名:任一基本类型名,基本类型的派生类型名,用户定义的类枚举类型结构类型联合类型名。 类型名为void 时,称为不确定类型的指针类型。 类型名

2、也可以是由类型名*表示的指针类型名,这时称为多级指针(指针类型的指针)。 符号*:表示其后说明的变量为指针变量。 指针变量名:标识符。 初值:可缺省。它可以是该类型的某一变量的地址。,5,一个指针变量,可有三种状态: (1) 未赋任何值,“悬空”状态。 (2) 被赋予NULL 值。未指向任一变量。 (3) 指向某一变量。,注:规定NULL 与整数0 通用,它是唯一可以赋给任一类型指针变量的值。,6,6.2.2 指针变量的操作,1. 取地址运算 /任一数组名字a都是一个常量指针, /代表数组的首地址, 也即, a总等同于int* pa=a; /pa为变量指针,此时pa与a /均指向数组a的首元素

3、 则,下述三种表示数组元素ai的方式是等同的: a0 *a *pa a1 *(a+1) *(pa+1) . a9 *(a+9) *(pa+9),11,另,下述三种表示数组元素ai之地址的方式也是等同的: 却都是不正确的句子! 为什么?)。,12,另外需注意的是:pa是变量,它当前所指的元素可以随时变化,从而pa+1,pa+等语句所指向的元素也跟着变化。 换句话说,使用指针变量去访问数组元素时,应随时检查指针变量当前所指向的数组元素。 指针变量也可以指向二维、三维等多维数组元素,例如:二维数组 int a34的存储结构为:,13,2) 若p,q都为同类型的指针,则p-q为p与q之间的数据项数(当

4、p,q指向同一数组时,结果有意义)。,3. 指针的关系运算,指针变量可以参加关系运算。这要分三种情况: (1)一般指针可以进行相等和不等的比较,指向同一变量(地址)者为相等,否则不等。 (2)任一指针可以和指针常量NULL 进行相等和不等的比较。如一指针p 已经指向了某变量,则它不等于NULL。,14,(3)数组指针,可以指向该数组的各个元素,且一个数组的各个元素在内存中是顺序存放的,故数组指针之间不但可以进行相等和不等比较,也可以进行大于,小于,大于等于,小于等于等的比较。,15,6.2.3 指针与数组,1指向数组元素的指针,2指向数组的指针,把数组作为整体,称为指向数组的指针,对于这类指针

5、,其说明语句格式为: 类型名(*指针变量名)数组元素数; 而指向多维数组的指针说明中,最后一项数组元素数可有多个。 指向数组的指针又叫行指针,指向数组元素的指针又叫列指针。,16,例如:int A34,(*pa)4; pa=A;,表示指针变量pa 是一个指向一维整型数组的指针,该数组包含四个整型元素。,执行增量运算pa+;后,pa 指向一维数组A1,数组A1的四个元素是A10,A11,A12,A13。 它们也可表示为(*pa)0,(*pa)1,(*pa)2,(*pa)3。,17,例如: float *P=int *p12;int(*p2)4; p 是指向int 型变量的指针,p1 是由两个整型

6、指针组成的指针数组,而p2则是一个指向一维整型数组的指针。,20,4. 指向指针的指针,例: int x, *p, *q; /q为指向指针的指针 x=123; p= /x, *p, *q之值均为123,21,若指向指针的指针变量p指向指针数组name首地址,则p+i指向namei即是namei的地址。 pi*(p+i):是namei的值,还是地址,是namei指向的目的变量(数组)的地址(首地址) *(p+i):是namei指向的目的变量(数组)的值(第0号元素的值) pij*(*(p+i)+j) (*(p+i)j:是namei指向的一维数组的第j号元素的值, 总之,p的地位相当于name,类

7、似于二维数组的首地址 。,22,6.2.4 字符串指针,字符串是一种特殊的数据形式,它实际上是一维字符数组。C+语言对于字符串的操作提供了多种手段,其中利用字符串指针是最方便的一种。, 说明与初始化,字符串指针没有自己独立的形式,其说明语句的格式与字符类型指针相同。,23,例如: char ch= a: char *pc1=,void swap(float pa,float pb) float t=pa; pa=pb; pb=t; ;,注意:并非只要使用指针作函数的参数就可实现双向传值。,31,2返回指针的函数,说明格式:* ( );,例: int * f(); /f为无参函数,其返回值类型

8、/为int*,即指针类型。 char * match(char c, char * str); /match为具有两个参数的函数, /其返回值类型为char*,即指针类型。,返回值为指针的函数称为指针型函数。,32,下述示例性程序使用了返回指针值的自定义函数,实现如下功能: 提示用户输入任意一个字符串,而后找到输入串中第一个a字符出现的位置(若有的话),并输出从a字符开始的子串; 若输入串中不出现a字符的话, 输出 “No match found”。,程序见p6_2.cpp,33,3指向函数的指针变量,函数不是数据,但它与变量还是有两点相通之处:一个是它有类型(返回类型),另一个是它也有地址,

9、称为入口地址,故在有的书中也勉强地把函数仍归为一种特殊的数据“类型”。 函数的地址也可作指针的值,这就是函数指针。,指向函数的指针变量的说明格式: (*指针变量名)(参数表);,34,例如:int(*pf)(float); 其中pf 是一个函数指针变量,由于对pf 的说明中已规定了函数的返回类型(有时还包括存储类型)和参数表,因此,指针pf 只能够指向这类函数。例如: int f1(float);int f2 (char);int f3(float);int f4 (float); 这时,下面的说明和赋值,就有合法与不合法的区别: int(*pf)(float)= /不合法 pf= (2)in

10、t* a; (3)int* a; (4)int a10; (5)int* a10; (6)int (*a)10; (7)int a( ); (8)int* a( ); (9)int (*a)( );,37,6.3 指针与动态内存分配,通过使用new与delete单目运算符来实现动态变量的分配与撤消。 1) new 使用格式: new /动态变量 new ( ) new /动态数组 功能: 生成一个(或一批)所给类型的无名动态变量,返回所生成变量的指针值(首地址)。,38,例: int *pi, *pj, a=10; char *pc; pi = new int; *pi = a*a; pc =

11、 new char(A); pj = new int10;,39,2) delete 使用格式: delete delete 功能: 释放通过new生成的动态变量(或动态数组),但指针变量仍存在。,40,例: int *pi, *pj; pi = new int; pj = new int10; . delete pi; /释放动态变量*pi, 但指针变量pi仍存在 delete pj;,41,3) 使用示例,1.从键盘输入10个int型数,而后按输入的相反顺序输出它们。要求使用new运算符动态申请数据空间存放数据。,程序见p6_5.cpp,注:在使用动态变量时,要注意保护动态变量的地址,不要

12、轻易地冲掉保存动态变量地址的指针变量的值,否则动态变量将丢失。,2.构建人员档案链表,程序见p6_8.cpp,42,6.4 引用类型,简单的说,引用是某个变量或对象的别名。建立引用时,必须用某个变量名或对象名来对它进行初始化,从而将该引用绑定在那一个变量或对象上。 即是说,建立引用并不重新为其分配内存空间,引用只是另一变量或对象的别名,任何对引用的使用与改变都是对该引用所绑定的那一变量或对象的使用与改变。,43,1. 引用的建立,建立引用的格式如下: ”之后,b与refb的当前值都将是55,而a与refa都在原有值2的基础上增加了2,即当前值都变成了4。,44,2. 引用和指针的区别,引用和指

13、针从说明到使用上都有些相似,但在概念上却有着明显的不同。主要区别在以下几个方面。 (1) 指针表示的是一个对象变量的地址,而引用则表示一个对象变量的别名。因此在程序中表示其对象变量时,前者要通过取内容运算符“*”,而后者可直接代表。例如: int a;int *pa=,45,(2) 指针是可变的,它可以指向变量a,也可以指向变量b,而引用则只能在建立时一次确定(固定绑定在某一个变量上),不可改变。例如: int a,b=456;int *p=”的赋值只是将b的值(即456)赋给了与ra绑定的变量a;而后者试图为引用ra重新建立新的绑定关系则会导致出现一个编译错误(ra重定义,重复初始化)。,46,(3) 由于引用本身不是一个独立的变量(它本身不具有独立的变量地址,使用的是与其绑定的那一变量的地址),所以,不能出现引用的引用,不能出现元素为引用的数组,也不能使用指向引用的指针(注意,可以出现指针的指针、可以出现元素为指针的数组,也可以说明对指针的引用,这都缘于指针是独立变量的缘故)。 int /OK! 可以说明对指针的引用 /将引用pref与int*类型的指针变量pi进行了绑定,47,3

温馨提示

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

评论

0/150

提交评论