《中国地质大学》ppt课件

上传人:tian****1990 文档编号:72568328 上传时间:2019-01-23 格式:PPT 页数:37 大小:256KB
返回 下载 相关 举报
《中国地质大学》ppt课件_第1页
第1页 / 共37页
《中国地质大学》ppt课件_第2页
第2页 / 共37页
《中国地质大学》ppt课件_第3页
第3页 / 共37页
《中国地质大学》ppt课件_第4页
第4页 / 共37页
《中国地质大学》ppt课件_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《《中国地质大学》ppt课件》由会员分享,可在线阅读,更多相关《《中国地质大学》ppt课件(37页珍藏版)》请在金锄头文库上搜索。

1、,第五章 指针和引用,指针是一种特殊的数据类型。 指针概念是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所示:,valu

2、e,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

3、*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= 这里,“*”作为访问目标变量的运算符,在定义指针时, “*”作为说明

4、符。注意使用上的区别。,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 指针运算 指针运算实质

5、上是地址运算。 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=

6、“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; 则

7、下标为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; ,运行结

8、果为: 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 f

9、or(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”

10、; 二、字符串常量 在C+中,字符串常量是由双引号括起的一串字符。 字符串常量通常存放在data area 的const 区中,并以0作为结束符,编译器记下其起始地。即:地址代表了这个字符串常量。 由于字符串常量的地址属性,所以由相同字符组成的字符串常量是两个不同起始地址的字符串常量。,5.5 字符指针,三、字符指针 指向字符类型的指针称为字符指针。 字符串常量和字符数组名都具有地址特性,当把它们赋给一个字符指针后,编译器规定: 输出字符指针就是输出字符串; 输出字符指针指向的对象,就是输出单个字符。,例如: #include void main() char buffer10=“ABC”;

11、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串小

12、于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 *prona

13、me=“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 ,二、指针数组与二维数组 字符指针数组与字符二维数组的主要不同之处是:字符指针数组元素指向的字符串可

14、以是不规则的长度。 字符二维数组的每个元素的长度必须相同,在定义时已确定。例如:上例中 proname08个字节字符串 proname12个字节字符串 proname24个字节字符串 总字节数为6+14=20,在二维数组中: char name38=“FORTRAN”, “C”, “C+” ; 共需3824个字节。 可见使用字符指针数组更灵活方便。,三、指向指针的指针 如果在一个指针变量中存放的是另一个变量的指针的地址, 称该指针为指向指针的指针,即二重指针。 例如:下图中P是二重指针,&q,&v,120,p指针,q指针,v变量,*p,*p,如下面定义: char *pc=“abc”, “de

15、f”, “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 是对

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号