第五章指针和引用_第1页
第五章指针和引用_第2页
第五章指针和引用_第3页
第五章指针和引用_第4页
第五章指针和引用_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章指针和引用第五章指针和引用第五章指针和引用第五章指针和引用 如有定义:如有定义: int value=150; char ch=M; pv=&value; pc=&ch; /pv holds the address of value 由于由于pv中存放的是中存放的是value变量的地址,变量的地址,pc中存放的是中存放的是ch变量变量的地址,故称的地址,故称pv和和pc为指针变量。简称为指针(为指针变量。简称为指针(Pointer)。)。第五章指针和引用第五章指针和引用指针指向的对象称为目标或目标变量(常量)。如图指针指向的对象称为目标或目标变量(常量)。如图7.1所示:所示: 150

2、M valuechpvpc*pv*pc图1 内存空间1000H1050H 0000H&value 1000H 1001H&ch 1050H&pc 11A2H 11A3H 11A1H&pv 11A0H第五章指针和引用第五章指针和引用C+规定:规定: 目标或目标变量可以用指针变量名前加上运算符目标或目标变量可以用指针变量名前加上运算符“ * ”表示。表示。pv的目标变量的目标变量value可表示为可表示为*pv,pc的目标变量的目标变量ch可表示为可表示为*pc,即即 *pv和和value等效等效 *pc和和ch等效等效而而&pv和和&pc表示针变量本身的地址,当指针变量为表示针变量本身的地址,当

3、指针变量为2个字节时,个字节时,最大访问地址为:最大访问地址为:162指针的定义指针的定义指针变量也必须先定义后使用指针变量也必须先定义后使用定义的一般格式:定义的一般格式:类型定义符类型定义符 *指针变量名指针变量名;其中:类型定义符其中:类型定义符指针指向对象的数据类型指针指向对象的数据类型 “*”说明符,表示其后的标识符是指针变量,而不是说明符,表示其后的标识符是指针变量,而不是 一般变量。一般变量。第五章指针和引用第五章指针和引用例如:例如: int *ptr ; char *name ; float *pf ; 其中,定义其中,定义ptr,name,pf分别为指向整型、字符型和浮点型

4、分别为指向整型、字符型和浮点型数据的指针。数据的指针。 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 col

5、or , *pc;执行语句执行语句 pn=# pc=&color;则在程序中则在程序中 *pn=100; 等效于等效于num=100; *pc=r; 等效于等效于color=r;这里,这里,“*”作为访问目标变量的运算符,在定义指针时,作为访问目标变量的运算符,在定义指针时,“*”作为说明符。注意使用上的区别。作为说明符。注意使用上的区别。指针赋值指针赋值 使用指针前,必须给已定义指针变量赋以指向目标变量的使用指针前,必须给已定义指针变量赋以指向目标变量的地址值。地址值。“&”操作符可获取变量的地址。操作符可获取变量的地址。第五章指针和引用第五章指针和引用同种数据类型的指针变量之间可以

6、相互赋值。同种数据类型的指针变量之间可以相互赋值。 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;指针变量的类型名与指向目标的数据类型一致。指针变量的类型名与指向目标的数据类型一致。 例如:例如: int *p, a; float b, *q; p=&b; q=&a; /错误错误 p=&a; q=&b; /正确正确第五章指针和引用第五章指

7、针和引用例:有关指针概念的程序例:有关指针概念的程序/ex5_3.cpp#include void main( ) int w, *p = &w; *p = 800; coutw=wt&w=&wendl; cout*p=*pt&p=&pendl; couttp=pendl;结果:结果: w=800 &w=0 x0012FF7C*p=800 &p=0 x0012FF78 p=0 x0012FF7C指针变量的地址指针变量的地址 指针也是变量,指针变量的地址是指它本身的内存地址,指针也是变量,指针变量的地址是指它本身的内存地址,如如图图1所示。所示。第五章指针和引用第五章指针和引用图示如下:图示如下

8、:0012:FF7C(&w)800pw0012:FF7C*p0012:FF78 (&p) 指针运算实质上是地址运算。指针运算实质上是地址运算。 1 1、赋值运算、赋值运算 2 2、取地址运算、取地址运算“& &”(address ofaddress of)和取内容运算)和取内容运算“* *” (DereferenceDereference),),“& &”和和“* *”互为逆运算,互为逆运算, 例如:例如: int x, int x, * *ptr=&x;ptr=&x; 则则 &(&(* *ptr)ptr) 表示指针表示指针ptrptr * *(&x)(&x) 表示变量表示变量x x图2第五章

9、指针和引用第五章指针和引用3、指针与整数的加减运算、指针与整数的加减运算在数组中,指针变量加上或减去一个整数在数组中,指针变量加上或减去一个整数n,表示:,表示:指针由当前所指向的位置向前或向后移动指针由当前所指向的位置向前或向后移动n个数据元素的位置。个数据元素的位置。移动后的实际地址为:移动后的实际地址为: p n*sizeof(数据类型数据类型)4、指针的关系运算、指针的关系运算指向同种数据类型的指针可作关系运算,表示它们所存放的指向同种数据类型的指针可作关系运算,表示它们所存放的地址之间的关系。地址之间的关系。 , = = , !=指针运算示例:课本指针运算示例:课本P57例例4.2第

10、五章指针和引用第五章指针和引用/ex5_2a.cpp#include void main( )int a10, *p, *q;couta=aendl;couta+1=a + 1endl;couta+2=a + 2endl;p = &a5;q = p;p +;q -; coutp=pendl; coutq=qendl; p = &a2; q = &a6; coutq-p=q - pendl; coutp=pendl; coutq=qendl; coutp+4=p + 4endl;第五章指针和引用第五章指针和引用 例例/ex5_3.cpp#include void main( )char *p1,

11、 *p2;p1 = C Program;p2 = p1 + 8;while (p2 = p1)cout*p2;p2-;coutendl;margorP Cp1p2第五章指针和引用第五章指针和引用指针与数组指针与数组 C+规定定义一个数组时,用数组名存放该数组在内存规定定义一个数组时,用数组名存放该数组在内存中的首地址。中的首地址。 当把数组名赋予一个指针变量后,该指针指向数组,当把数组名赋予一个指针变量后,该指针指向数组,可以通过指针移动方式访问数组元素。可以通过指针移动方式访问数组元素。例如:例如: int a20, *p; p=a; 则下标为则下标为i 的元素可表示为:的元素可表示为: a

12、i, *(a+i), pi, *(p+i), 对应地址可表示为:对应地址可表示为: &ai, a+i, &pi, p+i注意:注意: 数组名是指针常量,数组名是指针常量,不是指针变量,不能给数不是指针变量,不能给数组名赋值。组名赋值。第五章指针和引用第五章指针和引用 数组元素的表示方法示例第五章指针和引用第五章指针和引用例如:下面程序是用指针方式访问数组元素,计算数组元素之和。例如:下面程序是用指针方式访问数组元素,计算数组元素之和。 #include void main() int iarray10=0,2,4,6,8,10,12,14,16,18; int sum=0; int *iptr

13、=iarray; /指针初始化指针初始化 for(int i=0;i10;i+) sum+=*iptr; iptr+; cout“sum is “sumendl; 运行结果为:运行结果为: 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

14、(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+) sum3+=*(iptr+n); iptr=iarray; /方法方法4 for(n=0;nsize;n+) sum4+=iptrn; for(n=0;nsize;n+) /方法方法5 sum5+=*(iarray+n); coutsum1endl; c

15、outsum2endl; coutsum3endl; coutsum4endl; coutsum5endl;答案为:答案为: 174 174 174 174 174第五章指针和引用第五章指针和引用 数组中每个元素为字符的数组称为字符数组,字符数组数组中每个元素为字符的数组称为字符数组,字符数组可用单个字符常量初始化,也可用字符串常量初始化,例如:可用单个字符常量初始化,也可用字符串常量初始化,例如: char buffer=“hello”; 在在C+中,字符串常量是由双引号括起的一串字符。中,字符串常量是由双引号括起的一串字符。 字符串常量通常存放在字符串常量通常存放在data area 的的

16、const 区中,并以区中,并以0作为结束符,编译器记下其起始地。即:地址代表了这个字作为结束符,编译器记下其起始地。即:地址代表了这个字符串常量。符串常量。 由于字符串常量的地址属性,所以由相同字符组成的字由于字符串常量的地址属性,所以由相同字符组成的字符串常量是两个不同起始地址的字符串常量。符串常量是两个不同起始地址的字符串常量。第五章指针和引用第五章指针和引用三、字符指针三、字符指针 指向字符类型的指针称为字符指针。指向字符类型的指针称为字符指针。 字符串常量和字符数组名都具有地址特性,当把它们赋字符串常量和字符数组名都具有地址特性,当把它们赋给一个字符指针后,编译器规定:给一个字符指针

17、后,编译器规定: 输出字符指针就是输出字符串;输出字符指针就是输出字符串; 输出字符指针指向的对象,就是输出单个字符。输出字符指针指向的对象,就是输出单个字符。第五章指针和引用第五章指针和引用例如:例如:#include void main() char buffer10=“ABC”; char *pc; pc=“hello”; coutpcendl; /输出输出hello pc+; coutpcendl; /输出输出ello cout*pcendl; /输出输出e pc=buffer; coutpc; /输出输出ABC第五章指针和引用第五章指针和引用 字符串比较是指两个字符串进行逐个字符的一

18、一比较。字符串比较是指两个字符串进行逐个字符的一一比较。 通常使用在通常使用在string.h头文件中定义的头文件中定义的strcmp( )函数,其原型函数,其原型为:为: int strcmp(const char *str1,const char *str2);其返回值:其返回值: (1) 当当str1串等于串等于str2串时,返回值串时,返回值0; (2) 当当str1串大于串大于str2串时,返回一个正值;串时,返回一个正值; (3) 当当str1串小于串小于str2串时,返回一个负值。串时,返回一个负值。第五章指针和引用第五章指针和引用 C+中,可以使用在中,可以使用在string.

19、h中定义的标准函数中定义的标准函数strcpy( )对对字符数组进行赋值。字符数组进行赋值。 函数原型为:函数原型为: char *strcpy(char *dest,const char *src); 返回值为返回值为dest值。值。 例如:例如: char buffer110; char buffer210; strcpy(buffer1,”hello”); strcpy(buffer2,buffer1);字符串常量字符串常量“hello”赋给字符数组赋给字符数组buffer2。第五章指针和引用第五章指针和引用 一个数组中若每个元素都是一个指针,则称为指针数组。一个数组中若每个元素都是一个

20、指针,则称为指针数组。例如:定义一个指针数组并初始化例如:定义一个指针数组并初始化 char *proname=“FORTRAN”, “C”, “C+”; 该数组的每个元素是指向字符串常量的字符指针,指针指该数组的每个元素是指向字符串常量的字符指针,指针指向的字符串常量存放在向的字符串常量存放在data area 的的const 存储区中,可能连续,存储区中,可能连续,也可能不连续。也可能不连续。第五章指针和引用第五章指针和引用该字符数组的内存表示如下:该字符数组的内存表示如下:0088:22510088:22590088:225B0067:44000067:44020067:44040088

21、:2251FORTRAN0C0C+00088:22522253225422552256225722582259225A225B225C0088:225D0088:225EChar *proname 第五章指针和引用第五章指针和引用 字符指针数组与字符二维数组的主要不同之处是:字符指字符指针数组与字符二维数组的主要不同之处是:字符指针数组元素指向的字符串可以是不规则的长度。针数组元素指向的字符串可以是不规则的长度。 字符二维数组的每个元素的长度必须相同,在定义时已确字符二维数组的每个元素的长度必须相同,在定义时已确定。例如:上例中定。例如:上例中 proname08个字节字符串个字节字符串 pr

22、oname12个字节字符串个字节字符串 proname24个字节字符串个字节字符串 总字节数为总字节数为6+14=20在二维数组中:在二维数组中: char name38=“FORTRAN”, “C”, “C+” ; 共需共需3824个字节。个字节。 可见使用字符指针数组更灵活方便。可见使用字符指针数组更灵活方便。第五章指针和引用第五章指针和引用 如果在一个指针变量中存放的是另一个变量的指针的地址,如果在一个指针变量中存放的是另一个变量的指针的地址,称该指针为指向指针的指针,即二重指针。称该指针为指向指针的指针,即二重指针。 例如:下图中例如:下图中P是二重指针是二重指针&q&v120p指针指

23、针q指针指针v变量变量*p*p第五章指针和引用第五章指针和引用如下面定义:如下面定义: char *pc=“abc”, “def”, “hig”; char *ppc; /定义定义ppc为二重指针为二重指针 ppc=pc; 显然指针数组名显然指针数组名pc 就是一个二重指针。就是一个二重指针。例如下面的程序把字符指针数组作为实参进行函数调用:例如下面的程序把字符指针数组作为实参进行函数调用: #include void print(char *,int); void main( ) char *pn=“Fred”, “Barney”, “Wilma”, “Betty”; int num=siz

24、eof(pn)/sizeof(char *); /求数组元素个数求数组元素个数(8/2) print(pn,num);/数组名数组名pn为二重指针作为实参数进行函数调用为二重指针作为实参数进行函数调用 第五章指针和引用第五章指针和引用 NULL是空指针。在是空指针。在C+中,中,NULL取值为取值为0,常常用以表,常常用以表示指针不指向任何地方的一种状态。示指针不指向任何地方的一种状态。 void *表示指针指向的目标对象无数据类型。表示指针指向的目标对象无数据类型。 注意两者的区别。注意两者的区别。第五章指针和引用第五章指针和引用 在程序中,引用可作为目标变量或对象的别名而使用,对在程序中,

25、引用可作为目标变量或对象的别名而使用,对引用的操作实际上就是对目标变量或对象的操作。引用的操作实际上就是对目标变量或对象的操作。 建立引用的方法:建立引用的方法: int value; int& rvalue=value; / rvalue initialized 说明说明rvalue 是对整型数据的引用,并初始化为整型变量是对整型数据的引用,并初始化为整型变量value 的引用。的引用。第五章指针和引用第五章指针和引用注注 意意1、引用在说明时必须初始化,初始化变量必须是已定、引用在说明时必须初始化,初始化变量必须是已定义的变量;义的变量;2、引用不是变量,只是替代某个变量的别名;、引用不是

26、变量,只是替代某个变量的别名;3、引用不占内存空间,引用的地址与绑定的变量相同。、引用不占内存空间,引用的地址与绑定的变量相同。在程序中对引用的访问就是对其绑定的变量的访问。在程序中对引用的访问就是对其绑定的变量的访问。第五章指针和引用第五章指针和引用 #include void main( ) int intone; int& rint=intone; intone=5; cout“intone”intoneendl; cout“rint”rintendl; rint=25; cout“intone”intoneendl; cout“rint”rintendl; 运行结果为:运行结果为: i

27、ntone=5 rint=5 intone=25 rint=25例如:下面程序说明引用与其绑定的变量之间的关系。例如:下面程序说明引用与其绑定的变量之间的关系。第五章指针和引用第五章指针和引用注意:注意: 引用运算符与取地址运算符使用了相同符号引用运算符与取地址运算符使用了相同符号“&”,但使用,但使用场合不同,意义不同;场合不同,意义不同; 引用运算符引用运算符“&”仅在说明一个引用时使用,放在类型名后仅在说明一个引用时使用,放在类型名后面,表示是该数据类型的引用;在程序中,面,表示是该数据类型的引用;在程序中,“&”作为取地址操作为取地址操作运算符,放在变量前面。例如:作运算符,放在变量前

28、面。例如: int count; int& sum=count; /引用说面引用说面 int count; int *ip=&count; /取地址,对指针初始化取地址,对指针初始化 cout&ip; /输出变量输出变量ip 的地址的地址 cout&count; /输出变量输出变量count 的地址的地址第五章指针和引用第五章指针和引用如果程序中取引用的地址,它返回引用绑定的目标变量的如果程序中取引用的地址,它返回引用绑定的目标变量的地址;地址;(2) 对引用赋值,就是对绑定的目标变量的赋值;对引用赋值,就是对绑定的目标变量的赋值;(3) 若说明一个引用为若说明一个引用为T&,则引用必须用类型,则引用必须用类型T的目标变量,的目标变量,或能转换成类型或能转换成类型T的目标变量进行初始化。例如下面的说的目标变量进行初始化。例如下面的说明语句是合法的,明语句是合法的, double& rr=1; 因为整型因为整型1可以转换为可以转换为double,

温馨提示

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

评论

0/150

提交评论