中国地质大学C课件05.ppt_第1页
中国地质大学C课件05.ppt_第2页
中国地质大学C课件05.ppt_第3页
中国地质大学C课件05.ppt_第4页
中国地质大学C课件05.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

,第五章 指针和引用,指针是一种特殊的数据类型。 指针概念是C+语言中较难理解和较难掌握的概念之一。 本章介绍指针的概念、定义、运算等内容。,指针变量是一种特殊的变量,变量中存放的不是某种数据类型的数据,而是另一个变量或常量的地址。,5.1 指针概念,如有定义: int value=150; char ch=M; 并执行赋值语句: pv= /pv holds the address of value 由于pv中存放的是value变量的地址,pc中存放的是ch变量的地址,故称pv和pc为指针变量。简称为指针(Pointer)。,指针指向的对象称为目标或目标变量(常量)。如图7.1所示:,value,ch,*pv,*pc,图1 内存空间,1000H,1050H,C+规定: 目标或目标变量可以用指针变量名前加上运算符“ * ”表示。 pv的目标变量value可表示为*pv, pc的目标变量ch可表示为*pc, 即 *pv和value等效 *pc和ch等效 而&pv和&pc表示针变量本身的地址,当指针变量为2个字节时, 最大访问地址为:,指针的定义 指针变量也必须先定义后使用 定义的一般格式: 类型定义符 *指针变量名; 其中:类型定义符指针指向对象的数据类型 “*”说明符,表示其后的标识符是指针变量,而不是 一般变量。,例如: 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= 这里,“*”作为访问目标变量的运算符,在定义指针时, “*”作为说明符。注意使用上的区别。,5.2 指针赋值,使用指针前,必须给已定义指针变量赋以指向目标变量的地址值。“&”操作符可获取变量的地址。,指针赋值的几种情况: 同种数据类型的指针变量之间可以相互赋值。 int a, *pa, *pb; pa= /正确,例:有关指针概念的程序 /ex5_3.cpp #include void main( ) int w, *p = ,结果: w=800 &w=0x0012FF7C *p=800 &p=0x0012FF78 p=0x0012FF7C,指针变量的地址 指针也是变量,指针变量的地址是指它本身的内存地址,如图1所示。,图示如下:,5.3 指针运算 指针运算实质上是地址运算。 1、赋值运算 2、取地址运算“ 则 &(*ptr) 表示指针ptr *(&x) 表示变量x,图2,3、指针与整数的加减运算 在数组中,指针变量加上或减去一个整数n,表示: 指针由当前所指向的位置向前或向后移动n个数据元素的位置。 移动后的实际地址为: p n*sizeof(数据类型) 4、指针的关系运算 指向同种数据类型的指针可作关系运算,表示它们所存放的 地址之间的关系。 , = = , != 指针运算示例:课本P57例4.2,/ex5_2a.cpp #include void main( ) int a10, *p, *q; cout“a=“aendl; cout“a+1=“a + 1endl; cout“a+2=“a + 2endl; p = ,cout“p=“pendl; cout“q=“qendl; p = ,例 /ex5_3.cpp #include void main( ) char *p1, *p2; p1 = “C Program“; p2 = p1 + 8; while (p2 = p1) cout*p2; p2-; coutendl; ,5.4 指针与数组,C+规定定义一个数组时,用数组名存放该数组在内存中的首地址。 当把数组名赋予一个指针变量后,该指针指向数组,可以通过指针移动方式访问数组元素。,例如: int a20, *p; p=a; 则下标为i 的元素可表示为: ai, *(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=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(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; coutsum2endl; coutsum3endl; coutsum4endl; coutsum5endl; ,答案为: 174 174 174 174 174,一、字符数组 数组中每个元素为字符的数组称为字符数组,字符数组可用单个字符常量初始化,也可用字符串常量初始化,例如: char buffer=“hello”; 二、字符串常量 在C+中,字符串常量是由双引号括起的一串字符。 字符串常量通常存放在data area 的const 区中,并以0作为结束符,编译器记下其起始地。即:地址代表了这个字符串常量。 由于字符串常量的地址属性,所以由相同字符组成的字符串常量是两个不同起始地址的字符串常量。,5.5 字符指针,三、字符指针 指向字符类型的指针称为字符指针。 字符串常量和字符数组名都具有地址特性,当把它们赋给一个字符指针后,编译器规定: 输出字符指针就是输出字符串; 输出字符指针指向的对象,就是输出单个字符。,例如: #include void main() char buffer10=“ABC”; char *pc; pc=“hello”; coutpcendl; /输出hello pc+; coutpcendl; /输出ello cout*pcendl; /输出e pc=buffer; coutpc; /输出ABC ,四、字符串比较 字符串比较是指两个字符串进行逐个字符的一一比较。 通常使用在string.h头文件中定义的strcmp( )函数,其原型为: int strcmp(const char *str1,const char *str2); 其返回值: (1) 当str1串等于str2串时,返回值0; (2) 当str1串大于str2串时,返回一个正值; (3) 当str1串小于str2串时,返回一个负值。,五、字符串赋值 C+中,可以使用在string.h中定义的标准函数strcpy( )对字符数组进行赋值。 函数原型为: char *strcpy(char *dest,const char *src); 返回值为dest值。 例如: char buffer110; char buffer210; strcpy(buffer1,”hello”); strcpy(buffer2,buffer1); 字符串常量“hello”赋给字符数组buffer2。,一、定义 一个数组中若每个元素都是一个指针,则称为指针数组。 例如:定义一个指针数组并初始化 char *proname=“FORTRAN”, “C”, “C+”; 该数组的每个元素是指向字符串常量的字符指针,指针指向的字符串常量存放在data area 的const 存储区中,可能连续,也可能不连续。,5.6 指针数组,该字符数组的内存表示如下:,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,在二维数组中: char name38=“FORTRAN”, “C”, “C+” ; 共需3824个字节。 可见使用字符指针数组更灵活方便。,三、指向指针的指针 如果在一个指针变量中存放的是另一个变量的指针的地址, 称该指针为指向指针的指针,即二重指针。 例如:下图中P是二重指针,&q,&v,120,p指针,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=sizeof(pn)/sizeof(char *); /求数组元素个数(8/2) print(pn,num);/数组名pn为二重指针作为实参数进行函数调用 ,四、NULL指针 NULL是空指针。在C+中,NULL取值为0,常常用以表示指针不指向任何地方的一种状态。 void *表示指针指向的目标对象无数据类型。 注意两者的区别。,在程序中,引用可作为目标变量或对象的别名而使用,对引用的操作实际上就是对目标变量或对象的操作。 建立引用的方法: int value; int / rvalue initialized 说明rvalue 是对整型数据的引用,并初始化为整型变量value 的引用。,5.7 引用的概念,A reference is an alternative name for variable or object. To ensure that a reference is bound to a variable name or an object name, we must initialize the reference.,注 意 1、引用在说明时必须初始化,初始化变量必须是已定义的变量; 2、引用不是变量,只是替代某个变量的别名; 3、引用不占内存空间,引用的地址与绑定的变量相同。在程序中对引用的访问就是对其绑定的变量的访问。,#include void main( ) int intone; int ,运行结果为: intone=5 rint=5 intone=25 rint=25,例如:下面程序说明引用与其绑定的变量之间的关系。,注意: 引用运算符与取地址运算符使用了相同符号“ /输出变量count 的地址,如果程序中取引用的地址,它返回引用绑定的目标变量的地址; (2) 对引用赋值,就是对绑定的目标变量的赋值; (3) 若说明一个引用为T,5.8 引用的操作,(4) 可以说明对指针变量的引用,例如: int *a; int*,#include void main( ) int one; int,下面程序说明引用与其绑定的变量间的赋值及地址间的关系。,cout“rone:”roneendl; cout“ ,输出结

温馨提示

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

评论

0/150

提交评论