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

下载本文档

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

文档简介

1、第六章 指针、引用与 动态内存分配,导出数据类型(2)指针,指针与动态内存分配,导出数据类型(3)引用,6.1 导出数据类型(2)指针,一、指针变量说明,1、定义指针变量,格式: *,int *pi; /pi是一个指向int型变量的指针 char *pc; / pc是一个指向char型变量的指针 char (*pa)3; /pa是一个指向一维数组的指针 int (*pf)( ); /pf是一个指向函数的指针 int *pp; /pp是一个指向指针的指针,例,6.1 导出数据类型(2)指针,一、指针变量说明,1、定义指针变量,格式: *,说明,、每一个指针变量都有一个相应的类 型(void *指

2、针除外),该类型用以 说明这个指针变量所指向的地址中 存放数据的数据类型。,、一个指针变量所占的内存空间大小 与一个内存地址所占空间相等。即 一个int型指针变量与一个double型 指针变量占用同样大小的内存空间。,、指针是变量,所以凡可声明变量的 地方,就可声明指针变量。,、定义名为iPtr的指针可以写成: int* iPtr; (*靠左) int *iPtr; (*靠右) int * iPtr; (*两边都不靠),、在指针定义中,一个*只能表示一个指针。如: int *countPtr,count;声明countPtr为整型指针,声明count为整型,而不是整型指针。,6.1 导出数据类

3、型(2)指针,一、指针变量说明,2、指针的初始化, /error, 指针是变量,是变量就具有内存地址,故指针变量本身也有地址。,#include void main( ) int iCount=18; int *iPtr= ,运行结果: 58 0 x0067fe00 0 x0067fe00 58 0 x0067fdfc,6.1 导出数据类型(2)指针,一、指针变量说明,2、指针的初始化, *操作符:,int ,说明, 引用运算符与地址运算符虽然使用相 同的符号,但它们是不一样的。,6.1 导出数据类型(2)指针,一、指针变量说明,2、指针的初始化, *操作符:,int ,说明,与指针类似,下面

4、的三种声明引用的方 式都是合法的:,6.1 导出数据类型(2)指针,一、指针变量说明,2、指针的初始化, NULL指针,例,int *p=NULL;,一个指针变量可以被赋以空值,表明它不指向任何一个对象。,6.1 导出数据类型(2)指针,二、指针的运算,1、赋值运算,例,int a,*p=,可以将一个指针所指向的变量的地址值赋给它,也可以将一个数组或者函数在内存中的入口地址值赋给对应的指针,还可以将一个已被赋值的指针赋给另外一个相同类型的指针。,6.1 导出数据类型(2)指针,二、指针的运算,2、一个指针可以加上或减去一个整数值,包括 加1或减1运算。,3、在一定条件下,两个指针可以相减。,4

5、、在一定条件下,两个指针可以相比较。,1、赋值运算,6.1 导出数据类型(2)指针,三、指针与数组,1、指向数组元素的指针,例,int n10; int *pn=n; /指针pn指向数组n的首元素n0,有ni *(n+i) pni *(pn+i),6.1 导出数据类型(2)指针,三、指针与数组,2、指向数组的指针,例, (*);,假设float A24; float (*pa)4; pa=A; pa+; /pa指向一维数组A1,int (*pa)4;/表示pa是指向一维数组的指针,6.1 导出数据类型(2)指针,三、指针与数组,比较指向数组元素的指针和指向数组的指针,例,folat *p=,相

6、同点:p和pa指向同一地址 不同点:p指向一个整型下标变量A00, 所占空间2字节; pa指向一个整 型一维数组A0,所占空间8字节。,6.1 导出数据类型(2)指针,三、指针与数组,3、指针数组,例, *;,int a,b,c,d,A24; int *p14=, * ;,p1是由四个整型指针组成的指针数组,p2中的A0和A1分别表示A00和A01的地址。,6.1 导出数据类型(2)指针,三、指针与数组,3、指针数组,比较, *;,int *p;, * ;,int *p12;,int (*p2)4;,p是指向整型变量的指针,p1是由两个整型变量组成的指针数组,p2是一个指向一维整型数组的指针,

7、6.1 导出数据类型(2)指针,#include char *name =“ ”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”, “Sunday”; void main( ) int week; while(1) coutweek; if(week7) break; cout“Week No.”week“ is ”nameweekendl; ,练,编程实现输入星期几的数字,则输出该数字对应的英文名.,6.1 导出数据类型(2)指针,四、字符串指针,1、说明与初始化,#include void main(

8、) char buffer5=ABC; char *pc; pc=hello; coutpcendl; pc+; coutpcendl; cout*pcendl; pc=buffer; coutpc; ,buffer,6.1 导出数据类型(2)指针,四、字符串指针,2、字符串指针数组,例,char *menu =“File”, “Edit”;,0088:2251,0088:2252,0088:2253,0088:2254,0088:2255,0088:2256,0088:2257,0088:2258,0088:2259,0088:225A,menu,0067:4400,6.1 导出数据类型(2

9、)指针,#include void main( ) char *p1,a16,b16; p1=“I am a teacher.”; for(int i=0;i15;i+) ai=*p1+1; ai=0; coutaendl; for(i=0;i15;i+) bi=*(a+i)-1; bi=0; coutbendl; ,练,使用字符串指针编程,将其每个字符加1后生成新的字符串,再将其还原为原字符串。,6.1 导出数据类型(2)指针,四、字符串指针,3、利用字符串指针的标准函数,字符串长度函数strlen( ),功能:求出已知字符串的长度。,int strlen(char *str);,返回值:字

10、符串str的长度,不包含串尾符。,字符串长度函数strlen( ),#include #include int main( ) char *string1=“four”; cout“The length of string is:” strlen(string1)endl; return 0; ,输出结果: The length of string is:4,6.1 导出数据类型(2)指针,四、字符串指针,3、利用字符串指针的标准函数,字符串复制函数strcpy( ),char *strcpy(char *str1,char *str2);,6.1 导出数据类型(2)指针,四、字符串指针,3、

11、利用字符串指针的标准函数,字符串连接函数strcat( ),功能:把字符串2连接到字符串1的后面,返回值:字符串str1的地址,char *strcat(char *str1,char *str2);,注:要保证存放第一个字符串的数组足以存放两个字符串及结束符的合并。,字符串连结函数strcat( ),#include #include int main( ) char s120=“Happy ”; char s2 =“New Year”; coutstrcat(s1,s2)endl; return 0; ,输出结果: Happy New Year,6.1 导出数据类型(2)指针,四、字符串指

12、针,3、利用字符串指针的标准函数,字符串比较函数strcmp( ),功能:按字典序比较两个字符串的大小,返回值:根据两个字符串的大 小,返回正整数、0和 负整数,int strcmp(char *str1,char *str2);,字符串比较函数strcmp( ),#include #include int main( ) char buffer110=“hello”; char buffer2 =“hello”; if (strcmp(buffer1,buffer2)= =0) cout“equaln”; else cout“not equaln”; ,输出结果: equal,若改为 if(

13、“hello”= =“hello”) 或者 if(buffer1= =buffer2) 运行结果都是not equal 因为它们都是地址的比较。,6.1 导出数据类型(2)指针,#include #include void main( ) char *p1=“one”, *p2=“two”, *p3=“three”,s8; if(strcmp(p1,p2)0); strcpy(s,p2); else strcpy(s,p1); if(strcmp(s,p3)0); strcpy(s,p3); cout“The least string is ”sendl; ,练,已知三个字符串,编程求出它们的

14、最小者。,6.1 导出数据类型(2)指针,五、指针与函数,1、指针用作函数参数,对于复杂类型来讲,可以节省时间和空间,从而提高运行效率。,各种类型的指针都可以用作函数参数,指针做函数参数具有下述两个特点:,可以在被调用函数中改变调用函数的参数值,从而实现函数之间信息交换。,6.1 导出数据类型(2)指针,五、指针与函数,1、指针用作函数参数,编写一个交换变量a、b内容的程序。,int a=3,b=8; int t=a;a=b;b=t;,例,#include void swap(int,int); void main( ) int a=3,b=8; cout“a=”a“,b=”b endl; s

15、wap(a,b); cout“after swappingn”; cout“a=”a“,b=”b endl; void swap(int x,int y) int temp=x; x=y; y=temp; ,a=3,b=8 after swapping a=3,b=8,#include void swap(int *,int *); void main( ) int a=3,b=8; cout“a=”a“,b=”b endl; swap( ,a=3,b=8 after swapping a=8,b=3,6.1 导出数据类型(2)指针,五、指针与函数,2、指针函数,:返回指针的函数。, *(),

16、定义格式:,例,int *pf (int x, int y);,其中,pf是指针函数名,它有两个int型参数,返回值为int*。,6.1 导出数据类型(2)指针,五、指针与函数,2、指针函数,注:指针函数不能把它内部说明的具有局部作 用域的数据地址作为返回值。,:返回指针的函数。,int *getInt(char *str) /指针函数 int value=20; coutstrendl; return /VC给出警告:返回一个变量或临时空间的地址,6.1 导出数据类型(2)指针,五、指针与函数,3、函数指针, (*) ( ),:指向函数地址的指针。,、定义函数指针,例,int (*pf)(

17、);,其中,pf是指向函数的指针名,该指针指向一个返回值为int型数的函数。,6.1 导出数据类型(2)指针,五、指针与函数,3、函数指针,注意函数指针与指针函数的区别:,:指向函数地址的指针。,int (*func) (char a,char b);/函数指针,、定义函数指针,int *func (char a,char b); /指针函数,6.1 导出数据类型(2)指针,五、指针与函数,3、函数指针,函数指针与其他数据类型的指针尽管都是地址,但不能相互赋值,:指向函数地址的指针。,、定义函数指针,注,int *ip; /整型数据指针 void (*fp)( ); /函数指针 fp=ip;

18、/error:不能相互赋值 ip=fp; /error:不能相互赋值,6.1 导出数据类型(2)指针,五、指针与函数,3、函数指针,:指向函数地址的指针。,、函数指针用作函数参数,C+语言本身不允许把函数作为参数,然而有了函数指针,就可以通过函数指针,起到把函数作为参数的作用。,注,6.1 导出数据类型(2)指针,#include #include double sigma(double (*func)(double),double dl,double du) double dt=0.0; for(double d=dl;ddu;d+=0.1) dt+=func(d); /用函数指针func调

19、用函数sin return dt; void main( ) double dsum; dsum=sigma(sin,0.1,1.0);/sin函数为实参赋给函数指针func cout“The sum of sin 0.1 to 1.0 is ”dsumendl; ,例,计算步长为0.10的特定范围内的三角函数之和。,6.2 指针与动态内存分配,一、动态分配运算符,1、new运算符,格式:new (),new运算符用来生成无名动态变量,返回一个该类型的指针值,程序通过指针对这个变量进行操作。,6.2 指针与动态内存分配,int *pi,a=5; char *pc; float *pf,f=3.

20、0; pi=new int;/生成动态整型变量,类型名放在new之后 pc=new char6; /生成动态字符型数组 pf=new float(4.7); /生成动态浮点型变量,注意赋初值方法 *pi=a*a; /动态变量被赋初值 for(int i=0;i4;i+) *(pc+i)=a; /动态char型数组的每个分量被赋初值 f+=*pf; /动态变量*pf参与运算,一、动态分配运算符,1、new运算符,6.2 指针与动态内存分配,一、动态分配运算符,2、delete运算符,格式:delete ,delete运算符的操作数是new返回的指针,用来撤销或释放无名动态变量。,6.3 导出数据

21、类型(3)引用,一、引用和指针类型的区别,1、指针是通过地址间接访问某个变量,而 引用是通过别名直接访问某个变量。,int m; int *p=,m=5; *p=5; r=5;,三者的操作是等价的:,6.3 导出数据类型(3)引用,一、引用和指针类型的区别,2、引用 必须初始化,而一旦被初始化后不 得再作为其他变量的别名。而指针是可 变的,它可以指向变量m,也可以指向 变量n 。,int m,n; int *p=/合法,而引用r只能与m联系,6.3 导出数据类型(3)引用,一、引用和指针类型的区别,3、可以有空指针,不能有空引用。,int *p=NULL; /合法 int /无意义,6.3 导出数据类型(3)

温馨提示

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

评论

0/150

提交评论