C语言程序设计 CPD_08 更多课件请进我文库

上传人:zw****58 文档编号:52108727 上传时间:2018-08-18 格式:PPT 页数:38 大小:579.50KB
返回 下载 相关 举报
C语言程序设计 CPD_08 更多课件请进我文库_第1页
第1页 / 共38页
C语言程序设计 CPD_08 更多课件请进我文库_第2页
第2页 / 共38页
C语言程序设计 CPD_08 更多课件请进我文库_第3页
第3页 / 共38页
C语言程序设计 CPD_08 更多课件请进我文库_第4页
第4页 / 共38页
C语言程序设计 CPD_08 更多课件请进我文库_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《C语言程序设计 CPD_08 更多课件请进我文库》由会员分享,可在线阅读,更多相关《C语言程序设计 CPD_08 更多课件请进我文库(38页珍藏版)》请在金锄头文库上搜索。

1、第第8 8章章 指针指针北京工商大学北京工商大学 计算机与信息工程学院计算机与信息工程学院 何何 渝渝计算机程序设计基础计算机程序设计基础北京工商大学 何渝2本章主要内容* 引用 引用概念 用引用作为函数参数 指针 指针概念 用指针作为函数参数 动态存储 指针的各种应用计算机程序设计基础北京工商大学 何渝3 8.1 引言“指针”是C/C+中的一个重要概念,通过指针的应用可以使程序的效 率提高,代码精练;但指针应用不好 ,也会带来诸多负作用,因此在其它 一些计算机语言(如Java)中都取消了指针!计算机程序设计基础北京工商大学 何渝4 8.2 地址8.2.1 地址概念当要使用计算机中的数据和指令

2、代码时,都要将它们放入内存,它们也就占用一定数量 的内存单元。这些单元的最小单位为1个字节 (byte),每1个字节在内存都有一个编号(正整 数),常用用16进制数来表示,如:8AD1。数 据或指令代码在内存中占用存储单元的第1个 字节的编号称为该数据或指令代码的“地址”!计算机程序设计基础北京工商大学 何渝5例例 8. 18. 1int a=5, b=3, c=9; int a=5, b=3, c=9;float f=9.8; float f=9.8;char g=x, h=y; char g=x, h=y;它们在内存中的分配见右图。当它们在内存中的分配见右图。当 在程序中要访问某个变量时,

3、是在程序中要访问某个变量时,是 通过变量名来取得变量的值。实通过变量名来取得变量的值。实 际上在编译时将每一变量名对应际上在编译时将每一变量名对应 一个地址,在内存中不再出现变一个地址,在内存中不再出现变 量名而只有地址。程序中用变量量名而只有地址。程序中用变量 时只是找对应的地址,而不找变时只是找对应的地址,而不找变 量名。如量名。如 int 其中的pe变量为引用变量,被另一变量ma 初始化,称为ma的引用。在操作中可以当 作ma来使用。计算机程序设计基础北京工商大学 何渝9 引用仅仅是另一变量或对象的一个别名引用仅仅是另一变量或对象的一个别名 引用不能独立存在,引用不能独立存在,必须绑定到

4、某个已定义必须绑定到某个已定义 的变量或某个已定义的引用上。的变量或某个已定义的引用上。 定义引用时必须立即初始化定义引用时必须立即初始化 引用的类型应该与它所绑定的变量类型相同引用的类型应该与它所绑定的变量类型相同 引用与它所绑定的变量共享同一内存空间引用与它所绑定的变量共享同一内存空间* *8.3.2 8.3.2 引用的注意事项引用的注意事项计算机程序设计基础北京工商大学 何渝10 8.4 指针8.4.1 指针概念简单说,指针就是内存地址,但它常与指针变量联系到一起,而把变量两字省略了。如有说明语句:int ma=9; int *pe=其中pe变量为指针变量,用另一变量ma的地 址初始化,

5、称为pe指向了变量ma。这时pe的 值为ma的地址,而在执行时*pe为ma的值9。计算机程序设计基础北京工商大学 何渝11所谓指针变量是指:它是一个变量,且 它保存的值是一个地址。如:int ma; /ma是一个普通的整型变量int *pe=NULL; /pe是一个整型指针变量/初始化为空,称为空指针int *qt; /qt也是一个整型指针变量qt= /指针变量指向整型变量mape=qt; /pe也指向了ma;8.4.2 8.4.2 指针变量指针变量计算机程序设计基础北京工商大学 何渝12若有变量说明:int ma, *pe= 则有相互的等价关系:pe int *p1, *p2, *p;int

6、 i1=10, i2=20; int i1=10, i2=20;p1= p2= p1= p2=cout0) p=s0;s0=s1; s1=p; if(strcmp(s0,s1)0) p=s0;s0=s1; s1=p;if(strcmp(s0, s2)0) p=s0; if(strcmp(s0, s2)0) p=s0; s0=s2;s2=p;s0=s2;s2=p;if(strcmp(s1, s2)0) p=s1; s1=s2; if(strcmp(s1, s2)0) p=s1; s1=s2; s2=p;s2=p;for(j=0;j0) p=*p1; *p1=*p2; *p2=p; if(strc

7、mp(*p1, *p2)0) p=*p1; *p1=*p2; *p2=p;p2= p2=if(strcmp(*p1, *p2)0) p=*p1; *p1=*p2; *p2=p; if(strcmp(*p1, *p2)0) p=*p1; *p1=*p2; *p2=p;p1= p1=if(strcmp(*p1, *p2)0) p=*p1; *p1=*p2; *p2=p; if(strcmp(*p1, *p2)0) p=*p1; *p1=*p2; *p2=p;for(j=0;j3;j+) coutsj“ “; for(j=0;j3;j+) coutsj“ “; 运行结果与前面的例子相同运行结果与前面

8、的例子相同!计算机程序设计基础北京工商大学 何渝 8.6 动态存储分配当程序中定义了一个变量或数组,程序运行过 程中,始终都要占据相应的内存空间。只要程序不 结束,分配给它的存储单元就永远占据着,不会释 放,不管用不用这些空间。就会产生两种情况:要 么浪费大量保贵的内存资源;要么不够用!这种方 法缺乏灵活性。哪有什么好办法解决这种问题呢?有,可以根 据需要临时分配内存单元,当不用时又可以随时释 放这些单元,把这些单元另行分配,这样可更有效 的使用内存资源。这种办法就称为:动态存储分配 !计算机程序设计基础北京工商大学 何渝328.6.1 8.6.1 动态存储分配函数动态存储分配函数为了实现为了

9、实现动态存储分配,在语言中,是通在语言中,是通 过一些过一些C C的标准库函数中的的标准库函数中的malloc( )malloc( )、free( )free( )等函等函 数来实现的。数来实现的。C+C+通过相应的类来实现的!通过相应的类来实现的!语言的新标准语言的新标准ANSI CANSI C中,各中,各编译版本提供编译版本提供的标准库中应包括动态存储分配的函数有:的标准库中应包括动态存储分配的函数有:malloc( )calloc( )free( )realloc( )下面分别介绍:计算机程序设计基础北京工商大学 何渝33一、一、mallocmalloc函数函数作用:在内存中开辟指定大小

10、的存储空间,并将此存作用:在内存中开辟指定大小的存储空间,并将此存 储空间的起始地址作为函数值带回。其模型为:储空间的起始地址作为函数值带回。其模型为: void *malloc(unsigned int size)void *malloc(unsigned int size)若内存不能满足所申请的空间数,返回若内存不能满足所申请的空间数,返回“ “空指针空指针” ”,即地址为,即地址为 0 0,否则返回的函数值为一真实指针,否则返回的函数值为一真实指针( (地址地址) ) 。这个指针是指。这个指针是指 向向voidvoid类型的,即不规定任何具体的类型。如果想将这个指类型的,即不规定任何具体

11、的类型。如果想将这个指 针值赋给其它类型的指针变量,应在使用时进行显式的转针值赋给其它类型的指针变量,应在使用时进行显式的转 换换( (强制类型转换强制类型转换) )。如:。如:long *lp;long *lp;lp=(long *)malloc(8);lp=(long *)malloc(8);许多系统提供的许多系统提供的mallocmalloc返回的指针是指向返回的指针是指向charchar型的型的 ,即函数模型为:,即函数模型为:char *malloc(unsigned int size)char *malloc(unsigned int size)计算机程序设计基础北京工商大学 何渝

12、34二、二、calloccalloc函数函数void *calloc(unsigned int num, unsigned int size)void *calloc(unsigned int num, unsigned int size)作用:分配作用:分配numnum个大小为个大小为sizesize字节的内存空间。返回值为所字节的内存空间。返回值为所 分配空间的首地址。分配空间的首地址。三、三、freefree函数函数void free(void *ptr)void free(void *ptr)作用:将指针变量作用:将指针变量ptrptr所指向的存储空间释放,即交还给系所指向的存储空间释

13、放,即交还给系 统另作分配。该函数无返回值。统另作分配。该函数无返回值。四、四、reallocrealloc函数函数void *realloc(void *ptr, unsigned int size)void *realloc(void *ptr, unsigned int size)作用:将作用:将ptrptr指向的存储区指向的存储区(malloc(malloc分配分配的的) )改为改为size size 字节。字节。计算机程序设计基础北京工商大学 何渝35例例8.8 8.8 动态动态存储单变量存储单变量#include “stdlib.h“#include “stdlib.h“ #inc

14、lude “stdio.h“#include “stdio.h“ void main( )void main( ) int *iM=(int *)malloc(sizeof(int); /* int *iM=(int *)malloc(sizeof(int); /* 申请内存空间申请内存空间 * */ /printf(“ printf(“请输入请输入iMiM的值的值: “);: “);scanf(“%d“,iM); scanf(“%d“,iM);printf(“n iM printf(“n iM的地址为的地址为: %p n“,iM);: %p n“,iM);printf(“ iM printf

15、(“ iM所指地址中的内容为所指地址中的内容为: %d nn “, *iM);: %d nn “, *iM);printf(“ printf(“释放释放iMiM所指向的空间所指向的空间 程序结束程序结束! nn“);! nn“);free(iM); free(iM); /* /* 释放所申请的空间释放所申请的空间 * */ / 计算机程序设计基础北京工商大学 何渝36例例8.9 8.9 动态动态申请数组申请数组void main( )void main( ) int int iC, *iM, k;iC, *iM, k;printf printf(“(“请输入申请数组元素的个数请输入申请数组元素的个数: “);: “);scanfscanf(“%d“,(“%d“,iM iM=(int *)malloc(sizeof(int)*iC); / =(int *)malloc(sizeof(int)*iC); / 申请内存空间申请内存空间if(iM if(iM!=NULL)!=NULL) for(k=0; kiC; k+) iMk=k*2;for(k=

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

当前位置:首页 > 高等教育 > 其它相关文档

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