计算机语言C++指针ppt课件.ppt

上传人:飞****2 文档编号:29293658 上传时间:2022-07-29 格式:PPT 页数:42 大小:531.50KB
返回 下载 相关 举报
计算机语言C++指针ppt课件.ppt_第1页
第1页 / 共42页
计算机语言C++指针ppt课件.ppt_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《计算机语言C++指针ppt课件.ppt》由会员分享,可在线阅读,更多相关《计算机语言C++指针ppt课件.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、指针2主要内容指针的概念指针与地址操作符指针的声明指针的初始化指针运算指针与数组指针的指针void指针函数指针3校园生活举例F到教务处办事F教务处在校园什么位置或地址?F综合办公楼4楼F教务处空间位置F按空间位置行动,到达目的地F任何单位有一个逻辑名称地址,还有一个物理空间地址F人脑映射转换,控制行动4物理地址与逻辑地址F物理地址一般由地理区域的序号编码构成F逻辑地址一般由有意义的机构或人名构成F人们常常喜欢记逻辑地址F广东石油化工学院F广东省茂名市官渡二路139号F因为逻辑地址简单、形象、易记物理地址物理地址逻辑地址逻辑地址5工作举例办公桌的抽屉里存放文件柜抽屉的钥匙文件柜抽屉中存放各种资料

2、从文件柜某个抽屉中取资料如何操作?l打开办公桌抽屉l取出相应编号的钥匙l打开文件柜抽屉l拿出资料办公桌、文件柜存储器抽屉存储单元存储单元存放“物品”“地址”或“数据”6内存内存:256MB:256MB0 x00000000 x00000010 x00000020 x00000030 xFFFFFFF0 xFFFFFFE0 x00000040 x00000050 x00000060 x00000070 x00000080 x0000009物理地址物理地址168W3.14159char ch=W;int k=168;float Pi=3.14159;逻辑地址逻辑地址 内存储器地址与数据7地地址址译

3、译码码器器0 x00000000 x00000010 x00000020 x00000030 xFFFFFFF0 xFFFFFFE0 x00000040 x00000050 x00000060 x00000070 x00000080 x0000009物理地址物理地址编编译译系系统统逻辑逻辑地址地址物理物理地址地址内存内存:256MB:256MBW1683.14159逻辑地址向物理地址变换8函数函数整型数据整型数据首地址首地址首地址首地址内存储器内存储器浮点数据浮点数据字符数据字符数据首地址首地址首地址首地址结构体数据结构体数据首地址首地址C+程序的存储F地址是存放信息数据的内存单元的编号(编码

4、)FC+程序是通过名字(变量或函数名)来使用内存。这样做既直观,又方便F为某个变量或者函数分配存储器空间的工作由编译程序完成F存放在内存中的函数和数据都至少有一个地址F我们关心的是首地址:第一个字节的地址F通过地址直接使用内存较为快捷9指针的概念F用来存放内存地址的变量叫作指针变量,简称指针F指针是C+语言中的一种数据类型,是专门用来处理地址码集合的。又叫地址类型、指针类型,F由于“首地址”可以是整数变量的首地址,也可以是双精度变量首地址,指针变量也分为不同的类型F指针是一个变量,应遵循“先声明,后使用”的原则10含义含义: 取变量的地址取变量的地址单目运算符单目运算符结合性结合性:自右向左自

5、右向左含义含义: 从某个地址中获取从某个地址中获取数据,也叫取内容运算数据,也叫取内容运算符。符。单目运算符单目运算符结合性结合性:自右向左自右向左两者关系:互为逆运算取地址运算符&与指针运算符*11存储器存储器int x, *ipr; 0 x0013FF780 x0013FF7C0 x0013FF790 x0013FF7A0 x0013FF7B0 x0013FF7D0 x0013FF7E0 x0013FF7Fxiprx=3;30 x13FF78ipx=&x; *ipr=5;5v 直接访问:按变量地址存取变量值v 间接访问:通过存放变量地址的变量去访问变量12#include int max(

6、int a,int b) return ab?a:b; void main()int x=20,y=30;double fib1000=0,1;cout输出变量x的地址:&xendl;cout输出变量y的地址:¥dl;cout输出数组fib的地址:fibendl;c o u t 输 出 数 组 元 素 f i b 1 的 地址:&fib1endl;cout输出函数max()的地址:maxendl;13#include/输入半径求圆面积void main()double area,R,*dptr;dptr=&R;cout*dptr;dptr=&area;*dptr=3.14159*R*R;

7、cout圆面积是*dptrendl;cout 圆面积是 areaendl;14指针变量的声明F指针变量声明语句格式: 类型符 *指针变量名;int *pi,*iptr;float *pf;double *pd;char *pc;int * number;char * character;float * greatnumber;15#include int main ( ) int value1 = 5,value2 = 15;int * mypointer;mypointer = &value1;*mypointer = 10;mypointer = &value2;*mypointer =

8、20;cout value1= value1 / value2= value2;return 0;16#include int main ()int value1 = 5,value2 = 15;int *p1,*p2;p1 = &value1; / 将value1的地址赋给指针变量p1p2 = &value2; /将value2的地址赋给指针变量p2 *p1 = 10; / 指针变量p1指向的变量赋予数值10*p2 = *p1; / 将指针变量p1指向的变量赋给指针变量p2所指向的变量p1 = p2; / 将指针变量p2的值赋给指针变量p1*p1 = 20; / 指针变量p1所指向的变量赋予

9、数值20cout value1= value1 / value2= value2;return 0;17指针初始化int number;int *tommy = &number;int number;int *tommy;tommy = &number;18char * terry = “hello”;terry4 = !; *(terry+4) = !;19指针运算赋值运算l将一个指针赋值给另一个指针,结果是两个指针指向一个相同地址的单元例如:int a,*ip,*jp; jp=&a; ip=jp; l结果是ip和jp都指向整数变量a20算术运算l只进行加减算术运算,完成指针上下移动,对不同

10、的类型,移动的单位长度不同l指针算术运算符:+、-、+、-例如:double pi,*ptr=π ptr+; 表示指针ptr下移一个地址l指针+整数表达式例如: ptr+3 含义?l指针-整数表达式例如: ptr-3 含义?21注意:l递增“+”和递减“-”操作符比引用操作符“*”有更高的优先级l*p+ 等同于*(p+)l*p+ = *q+;等同于*p = *q;p+;q+;+*p22指针与数组F可以用指针指向数组中每个元素可以用指针指向数组中每个元素FC+C+规定单写数组名表示数组的首地址规定单写数组名表示数组的首地址F例如例如:float a20,:float a20,* *fpfp

11、= =a a; ;F数组名本身就当作指针常量,等于数组名本身就当作指针常量,等于&a0&a0F由于数组中的元素在内存中是连续排列存放,由于数组中的元素在内存中是连续排列存放,可以通过指针可以通过指针整数来指向任何元素整数来指向任何元素Fa0a0* *(fp+0) a1(fp+0) a1* *(fp+1)(fp+1) a2a2* *(fp+2)(fp+2) F原来通过下标存取数组元素,现在可以通过原来通过下标存取数组元素,现在可以通过指针来实现,这样更快捷指针来实现,这样更快捷23int a5=168,768,468,11168, 2168;int *pa=a,*pp;pa+;cout*pa;

12、?pa+=3;cout*pa; ?pp=pa-2cout*pp; ?pp-=2cout*pp; ?问题:指向双精度数组的指针增问题:指向双精度数组的指针增1 1实际加多少?实际加多少?16876846811162168a0a1a2a3a40 x0012FF6Cox0012FF700 x0012FF740 x0012FF780 x0012FF7C指针指向整型数组示例24#include int main () int numbers5;int * p;p = numbers;*p = 10;p+; *p = 20;p = &numbers2; *p = 30;p = numbers + 3;*p

13、 = 40;p = numbers;*(p+4) = 50;for (int n=0; n5; n+)cout numbersn , ;return 0;25F计算机中处理数组时,实际上将计算机中处理数组时,实际上将AiAi 转换成:转换成: * *( A + ( A + 下标表达式值下标表达式值 ) ) 即有:即有:AiAi * *(A+i(A+i) )F因为数组名表示该数组的首地址,所以:因为数组名表示该数组的首地址,所以: float A1000,float A1000,* *ptrptr=A;=A; int int i=0; i=0; 则有:则有:AiAi * *(A+i(A+i) )

14、 * *(ptr+i(ptr+i) )F因此用指针处理数组及元素是最快捷方式因此用指针处理数组及元素是最快捷方式26例:字符串复制函数开始开始声明字符数组声明字符数组SS,TT声明整数变量声明整数变量I=0I=0SI!=SI!=00TI=SITI=SII=I+1I=I+1TI=TI=00结束结束开始开始声明字符数组声明字符数组SS,TTchar char * *sp=S,sp=S,* *stst=T;=T;* *sp!=sp!=00* *stst = = * *spspst+,spst+,sp+* *stst = =00结束结束27#include void mystrcpy(char *de

15、stin,char *source)while(*source!=0)*destin=*source;source+;destin+;*destin=0;void main()char string1100=I am fine!;char string2100;mystrcpy(string2,string1);coutstring2;开始开始声明字符数组声明字符数组SS,TTchar char * *sp=S,sp=S,* *stst=T;=T;* *sp!=sp!=00* *stst = = * *spspst+,spst+,sp+* *stst = =00结束结束28问题:编写一个函数将

16、数组清零算法分析(用指针实现)l令指针P指向数组首地址l给指针指向的元素赋0值,即:*P = 0l指针P+l重复、直到整个数组处理完毕为止;注意循环N次,N是数组元素的个数。29#include void clear_array(float *ptr,int n)float *qtr=ptr+n;while(ptrqtr)*ptr=0;ptr+;void main()float a10=1,2,3,4,5,6,7,8,9,10;int i;for(i=0;i10;i+) couttai;coutendl;clear_array(a,10);for(i=0;i10;i+) couttai;cou

17、tn;30数组指针与指针数组char (*p)20 与 char * p20的区别char a1020, b1020;if (.) aijelse bij /* 此分支与上一分支的唯一区别是:前者是对a,后者是对b操作 */char (*p)1020;/*括号不能省略,否则p变成了指针构成的数组*/if (.) p = &a;else p = &b;(*p)ij /* 仅一份代码 */31指针的指针char a;char * b;char * c;a = z;b = &a;c = &b;32void指针指针void 是一种特殊类型的指针。void 指针可以指向任意类型的数据,可以是整数、浮点数

18、甚至字符串。唯一一个限制是被指向的数值不可以被直接引用(不可以对它们使用引用操作符“*”),因为它的长度是不定的,因此,必须使用类型转换操作或赋值操作来把void 指针指向一个具体的数据类型。33#include void increase (void* data, int type) switch (type) case sizeof(char) : (*(char*)data)+; break;case sizeof(short): (*(short*)data)+; break; case sizeof(long) : (*(long*)data)+; break; int main (

19、) char a = 5;short b = 9;long c = 12;increase (&a,sizeof(a);increase (&b,sizeof(b);increase (&c,sizeof(c);cout (int) a , b , c;return 0;sizeof是C+的一个操作符,用来返回其参数的长度字节数常量。 34函数指针当指针变量中存放了函数的入口地址,使得该指针指向这个函数时,通过该指针可调函数。一般形式: 类型标识符 (*函数指针变量名) (); (1)或者类型标识符 (*函数指针变量名) (形式参数类型说明表); (2)括号对不可缺少。最后的括号对表示该指针变

20、量所指向的是一个函数。(1)式表明所说明的函数指针其参数个数不定;(2)式则限定了形参的个数和类型。35#include int addition (int a, int b) return (a+b);int sub (int a, int b) return (a-b);int (*minus)(int,int) = sub;int operation (int x, int y, int (*functocall)(int,int) int g; g = (*functocall)(x,y); return (g);int main () int m,n; m = o p e ra t

21、i o n ( 7 , 5 , addition); n = operation (20, m, minus); cout n; return 0;36F程序中使用的变量、数组和函数必须先声明程序中使用的变量、数组和函数必须先声明后使用,编译系统根据声明语句开辟内存空后使用,编译系统根据声明语句开辟内存空间,因此数据占用的存储空间是固定的。这间,因此数据占用的存储空间是固定的。这种内存储器分配方法被称为种内存储器分配方法被称为静态存储分配静态存储分配F动态存储分配动态存储分配(dynamic allocation)(dynamic allocation)是在程是在程序运行过程中随机获得内存存储

22、空间的方法序运行过程中随机获得内存存储空间的方法FC+C+用运算符用运算符newnew和和deletedelete实现动态存储分配实现动态存储分配动态存储分配37F运算符运算符newnew用来申请所需的内存用来申请所需的内存 = new = new ( ); ;F也可为数组申请内存:也可为数组申请内存: = new = new ;F运算符运算符deletedelete用于释放先前申请到的存储块用于释放先前申请到的存储块delete delete ;F若要释放数组的空间,必须放一个空的方括若要释放数组的空间,必须放一个空的方括号号在操作符在操作符deletedelete和指向该类对象数组的和指向

23、该类对象数组的指针之间指针之间int int * *p = new intp = new int size; size;delete p;delete p; new和delete的使用38例:利用动态数组来求斐波那挈数列的前n项#include int main()int n;coutn;int *p =new intn; /申请数组空间if ( p=0 | n=0 )/如果没有申请到内存或数据输入有误,则返回 coutError!endl; return -1; p0=1;p1=1;coutp0endl;coutp1endl;for(int i=2; in; i+)pi=pi-2+pi-1;

24、coutpiendl;delete p;/释放数组空间return 0;39la+i=ai=*(a+i) =&ai0, 值相等,含义不值相等,含义不同同ua+i 表示第表示第i行首地址,指向行行首地址,指向行uai *(a+i) &ai0,表示第表示第i行第行第0列元素地址,指向列列元素地址,指向列a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2l对二维数组对二维数组 short a34,有有ua-二维数组的首地址,即第二维数组的首地址,即第0行的首地址行的首地址ua+i-

25、第第i行行的首地址的首地址uai *(a+i)-第第i行第行第0列列的元素地址的元素地址uai+j *(a+i)+j -第第i行第行第j列列的元素地址的元素地址u*(ai+j) *(*(a+i)+j) aij指针与二维数组指针与二维数组 二维数组和数组元素的地址二维数组和数组元素的地址 40int a34;a00a01a10a11a20a21a02a03a12a13a22a23二维数组元素表示形式:(1)a12(2)*(a1+2)(3)*(*(a+1)+2)(4)*(&a00+1*4+2)地址表示:(1) a+1 (2) &a10(3) a1(4) *(a+1)(5)(int *) (a+1)行指针列指针地址表示:(1) &a12(2) a1+2(3) *(a+1)+2(4)&a00+1*4+241表示形式含义地址a二维数组名,数组首地址a0,*(a+0),*a第0行第0列元素地址a+1第1行首地址a1,*(a+1)第1行第0列元素地址a1+2,*(a+1)+2,&a12第1行第2列元素地址*(a1+2),*(*(a+1)+2),a12第1行第2列元素值200020002008200820121342课后作业P185-189 思考与练习P189 任务3

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

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁