c++大学教程指针和基本指针的字符串

上传人:san****019 文档编号:82971838 上传时间:2019-02-25 格式:PPT 页数:70 大小:350KB
返回 下载 相关 举报
c++大学教程指针和基本指针的字符串_第1页
第1页 / 共70页
c++大学教程指针和基本指针的字符串_第2页
第2页 / 共70页
c++大学教程指针和基本指针的字符串_第3页
第3页 / 共70页
c++大学教程指针和基本指针的字符串_第4页
第4页 / 共70页
c++大学教程指针和基本指针的字符串_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《c++大学教程指针和基本指针的字符串》由会员分享,可在线阅读,更多相关《c++大学教程指针和基本指针的字符串(70页珍藏版)》请在金锄头文库上搜索。

1、1,第八章 指针和基于指针的字符串,指针 引用调用 数组与指针 函数指针,基于指针的字符串 总结,2,指针:地址数据,我们首先的观念就是简单地把地址作为数据,可以把地址存储在内存中。,int x; 1000 2 x = 2; 1004 1020 1000 由于地址作为数据对待,他们 也可以存储在内存中。,3,一个变量的指针,当一个变量存储另一个变量的地址时,那我们说它就是那个变量的指针。 在内存表中,我们经常用箭头来表示指针,x的真实地址和我们 理解的概念不 相关。 我们经常用任意 地址描述指针, 同时在以后经常 会放弃它。,int x; 1000 2 x = 2; 1004 1020 100

2、0 我们把1000作为整数2的指针,4,指针的概念,指针就是把地址作为数据,把地址存储在内存中 指针变量:存储地址的变量 变量的指针:当一个变量存储另一个变量的地址时,那我们说它就是那个变量的指针,如在某一程序中定义了 int x; X=2; 如系统给x分配的空间是1000号单元,则指向x的指针是另一个变量,该变量中存放的数据为1000,5,指针变量的声明,如何定义一个变量为指针变量? 类型标识符 *指针变量; 如:int *intp; double *doublep; char *chPtr; 多个指针变量需要分别加*: double *doublep,*doubleq;,6,关于指针的几个

3、问题,回答这些问题可以使我们更好地理解指针。,int x,*px; x = 2; 1000 x 2 1004 问题: 1、如何把x的地址置入px中? 2、如何用px处理和改变x? 1020 px,7,问题1:指针赋值,我们不能用简单的常数作为地址对指针进行赋值。我们永远不知道当我们编写程序时,变量地址的值将是什么?,int x,*px; 1000 x = 2; 2 1004 问题: 1、如何把x的地址置入px中? 我们不能用这样表示: 1020 px px=1000;,8,指针赋值,如何把某一变量的地址置入一个指针变量中? 用地址运算符 “ & 运算符后面不能跟常量或表达式。如 &2 是没有意

4、义的,&(m * n + p )。也是没有意义的,9,地址运算符,提供运算符返回操作数的地址,我们用&来表示。,int x,*px; 1000 x = 2; 2 1004 我们想要做的: px = x的地址 1020 我们应该表示为: px px = &x,10,处理内存地址,使用变量的指针就是为了用这个指针得到变量的值并改变它。,int x,*px; 1000 2 x = 2; 1004 px = 2、我们怎样用px得到x的值并 改变它? 1020 px,11,问题2:处理内存地址,如何用指针变量处理和改变它所指向的单元的值? 用引用运算符 “*” 解决。如 *intp 表示的是 intp

5、指向的这个单元的内容。 在对 intp 使用引用运算之前,必须先对 intp 赋值,12,引用运算符,在定义中,*号是语法标记同时和类型结合在一起产生一个指针定义。 在运算时,我们采用*号运算符,就象指针定义一样。 但是*号是独立 运算符,并和 指针一起表示 一个数值。,int x,*px,y; 1000 x 2 x = 2; 1004 px = ,13,指针处理,我们可以认为一个指针是另一个变量的参考,当我们处理这个变量时,我们叫这个运算符为“参考运算符”,这个操作为“参考指针”,int x,*px,y; 1000 x 2 x = 2; 1004 2 px = 1020 px *为引用运算符

6、,14,指针的基本类型,为什么指针要指向一定类型的数据? 地址对于编译器来说不足以解析地址的数据类型。 由于指针的基本数据类型可以对指针表达式进行错误检查, 比如,分配一 个整型数据指 针,或者反之 将产生一个警 告。,int x,*px,y; 1000 x 2 x = 2; 1004 px = 1020 指针必须要有一个明确的数据类型 px 1000 以便编译器可以解析数据的指向类型,15,指针实例,如有: int X, *intp, Y; X=3; Y=4; intp=,如执行: *intp=Y+4;,注意:不能用intp=100; 因为我们永远不知道变量存储的真实地址,而且程序每次运行可

7、能都不同。运行Fig.8.4 观察aPtr值的变化,16,指针的定义及使用,指针变量可以指向不同的变量。如上例中intp指向x,我们可以通过对intp的重新赋值改变指针的指向。如果想让intp指向y,只要执行intp=&y就可以了。这时,intp与x无任何关系。 同类的指针变量之间可相互赋值,表示二个指针指向同一内存空间。 空指针 指针没有指向任何空间 空指针用常量NULL表示,NULL的值一般赋为0 不能引用空指针指向的值,17,指针变量的使用练习,设有定义 int x, y; int *p1,*p2;,执行语句: x=23; y=234;,执行语句: p1=,执行语句: *p1=34; *

8、p2=17;,18,指针实例,有以下结构,比较执行 p1=p2和 *p1= *p2后的不同结果。,19,指针的初始化,指针在使用前必须初始化。 仅和别的变量一样定义指针,不初始化是一个比较普遍的错误。 没有初始化的指针可能指向任意地址,对这些指针作操作可能会导致程序错误。 NULL是一个特殊指针值,称为空指针。它的值为0。它可被用来初始化一个指针,表示不指向任何地址。,20,void指针,void指针:统配指针类型 定义:void *指针变量名; 作用:在标准C中,只有类型相同的指针之间能互相赋值,但任何类型的指针都能与统配指针互相赋值。主要用于动态内存分配。,21,第八章 指针和基于指针的字

9、符串,指针 引用调用 数组与指针 函数指针,基于指针的字符串 总结,22,传参数到函数的方法,C+有三种传递参数到函数的方法: 按值传递, 用引用参数按引用传递 用指针参数按引用传递 按值传递: 在函数内部对形式参数的任何改变都不会影响实际参数的值。,void swap(int a, int b) int c; c=a; a=b; b=c; ,如果调用 swap(x, y); 并不能真正交换x和y的值!,23,引用调用,但在某些应用中确实需要改变实际参数的值。例如,我们经常需要修改两个变量的值,希望有个函数可以实现此功能。要解决此问题可以采用指针作为参数。,24,引用调用-指针作为函数参数,v

10、oid swap(int *a, int *b) int c; c=*a; *a= *b; *b=c; ,swap(&x, &y),用指针作为参数可以在函数中修改主调程序的变量值,即实现变量传递。但必须小心使用!,调用:,25,指针作为函数参数,void swap(int *a, int *b) int c, d; c=*a; *a= *b; *b=c; a= b=&d ,swap(&x, &y),3,4,x y,a b c d,这里, 通过传指针仍然交换了x, y的值,交换后a, b又分别获得了局部变量c, d的地址. 所以函数本质上还是传值, 是将地址值传给了a, b变量.,调用:,26,

11、引用传递步骤,把函数参数声明为指针 在函数体内使用间接访问指针 当调用函数时,把地址作为参数传递,27,能解一元二次方程的函数,目前为止我们了解到的函数只能有一个返回值,由return 语句返回。 一个一元二次方程有二个解,如何让此函数返回二个解。答案是采用指针作为函数的参数。 函数原型可设计为: int SolveQuadratic(double a, double b, double c, double *px1, double *px2) 函数的调用 SolveQuadratic(1.3, 4.5, 2.1, &x1, &x2) SolveQuadratic(a, b, c, &x1,

12、&x2),28,完整的函数,int SolveQuadratic(double a,double b,double c, double *px1,double *px2) double disc, sqrtDisc; if(a = 0) return 1; disc = b * b 4 * a * c; if(disc0) return 1; sqrtDisc = sqrt(disc); *px1 = (-b + sqrtDisc) / (2 * a); *px2 = (-b - sqrtDisc) / (2 * a); return 0; ,29,SolveQuadratic的调用,int

13、main(void) double a, b, c, x1, x2; int result; cout“input a, b, c:n”; cinabc; result = SolveQuadratic(a, b, c, ,30,const修饰指针,指针是如此的奇妙, 通过传递指针值, 函数获得了对外界变量空间的访问权限, 尤其为其创造了修改空间中数据的机会. 如何通过指针只能做读取, 而不能写入?用const修饰 加const的时机: 遵循最小特权原则, 对于函数的参数, 在能满足函数处理数据的要求的前提下, 给予它最小的权限,31,const修饰参数的四种方式(1),指向非常量的非常量指针

14、 调用: int x; f( 此时, x是变量, ptr也是变量,32,指向常量数据的非常量指针 调用: int x; f( 此时, x是变量, ptr也是变量, 但不可以通过对ptr的引用运算而修改x的值,const修饰参数的四种方式(2),33,指向非常量的常量指针 调用: int x; f( 此时, ptr是常量, x的值也不可以通过ptr的引用方式来改动,const修饰参数的四种方式(3),34,指向常量的常量指针 调用: int x; f( 此时, ptr是变量, ptr所指的空间中的值也不能通过它来改变,const修饰参数的四种方式(4),35,sizeof,sizeof(类型名)

15、 返回该数据类型单个元素所占的字节数 sizeof 数组名 返回该数组所占的字节数,int array10; coutsizeof arrayendl;,void f(int *p, int len) coutsizeof pendl; 调用f(array, 10);,返回10*4 即 40,输出4, 即一个指针变量占据的空间, 而非数组array占据的空间,36,指针小结,37,第八章 指针和基于指针的字符串,指针 引用调用 数组与指针 函数指针,基于指针的字符串 总结,38,数组与指针,在C+中, 数组与指针是密切相关的, 两者几乎可以交换使用. 数组名代表数组的起始地址,因此一个数组名就是一个常量指针. 数组与指针相同之处 在访问内存方面的操作方式几乎相同 数组与指针不同之处 1、系统内存空间分配不同 2、数组名是常量指针,不能修改它的值。,39,指针的运算,const int N =5; int aN=1,2,3,4,5; 假设300是a的基地址 int *p;,a,p+i 本质是 p+4*i,3、 *(a+2) ?,2、+

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

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

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