C语言指针专题课件

上传人:我*** 文档编号:144914365 上传时间:2020-09-14 格式:PPT 页数:98 大小:2.01MB
返回 下载 相关 举报
C语言指针专题课件_第1页
第1页 / 共98页
C语言指针专题课件_第2页
第2页 / 共98页
C语言指针专题课件_第3页
第3页 / 共98页
C语言指针专题课件_第4页
第4页 / 共98页
C语言指针专题课件_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《C语言指针专题课件》由会员分享,可在线阅读,更多相关《C语言指针专题课件(98页珍藏版)》请在金锄头文库上搜索。

1、,指 针,Copyright 2008 By Neusoft Group. All rights reserved,指 针,目标: 本章旨在向学员介绍指针的概念以及各种指针的用法,通过本章的学习,学员应该掌握如下知识: 内存、地址与指针的概念 指针的用法,学时:15.0学时 教学方法:讲授ppt上机练习点评案例分析,内存,从变量的Scope开始 变量类型 局部变量 全局变量 静态变量 请问下面代码中,哪些是局部变量?哪些是全局变量?哪些是静态变量? int pi = 3; int Area(int r, int *sum) int b; static int c =0; b = pi * r

2、* r; c += b; *sum = c; return b ; ,内存,分析这段程序的执行结果 int pi = 3; int Area(int r, int *sum) int b; static int c =0; b = pi * r * r; c += b; *sum = c; return b ; int calculator() int sum1 = 0, sum2 = 0; int aa = 2, ab = 3, ac = 4; sum1 = Area( aa, / 执行后,sum1, sum2等于多少? ,内存,变量的存贮 内存:变量的存储位置 不同Scope的变量,存储在

3、不同内容区域;这反映了运算时变量不同的特性。 内存类型 内存分为静态内存和动态内存,动态内存又可以分为堆内存和栈内存。内存分配方式相应的分为静态存储区域分配、栈创建、堆分配。 静态存储区域分配 程序在编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。 例如前面例子中的变量(int pi)、静态变量(static int c)和常量; 栈创建 函数执行的时候,函数内的局部变量(包括函数参数)的存储单元都是在栈上创建的,函数执行后占用栈的存储单元会自动被释放。这种分配效率很高,但是分配的内存容量有限。占用栈内存多了,会出现栈溢出; 例如函数area的参数(int r, int *sum)

4、和局部变量(int b)就是栈创建的。 堆分配 也称动态存储分配,是指程序在运行时候用malloc申请的内存,程序员自己负责在何时用free释放内存。这种分配虽然灵活,但是使用时容易出错,需要注意。,内存,分为4个区域:,栈区auto,静态区static,堆区heap,代码区code,数据区,代码区,memory,存放程序的代码,存放程序的全局数据和静态数据,存放程序动态申请的数据,存放程序的局部数据和参数,内存,内存分配和释放,申请后的系统响应 Stack:只要栈的剩余空间大于所申请空间,系统将 为程序提供内存,否则将报异常提示栈溢出。 (*不是所有的系统都会报错) Heap: 操作系统有一

5、个记录空闲内存地址的链表, 当系统收到程序的申请时,会遍历该链表,寻找第一 个空间大于所申请空间的堆结点,然后将该结点从空 闲结点链表中删除,并将该结点的空间分配给程序 。,内存,申请大小的限制 Stack:栈是向低地址扩展的数据结构,是一块连 续的内存的区域。栈顶的地址和栈的最大容量是系统 预先规定好的 。 Heap: 堆是向高地址扩展的数据结构,是不连续 的内存区域 。堆的大小受限于计算机系统中有效的虚 拟内存。由此可见,堆获得的空间比较灵活,也比较 大。,内存,存储内容的比较 Stack:在函数调用时,第一个进栈的是主函数中函 数调用结束后的下一条指令(函数调用语句的下一条可 执行语句)

6、的地址,然后是函数的各个参数,在大多数 的C编译器中,参数是由右往左入栈的,然后是函数中 的局部变量。 注意:静态变量不入栈。当本次函数调用结束后,局 部变量先出栈,然后是参数,最后栈顶指针指向最开始 存的地址,也就是主函数中的下一条指令,程序由该点 继续运行 。 Heap:一般是在堆的头部用一个字节存放堆的大小。 堆中的具体内容由程序员安排。,内存,在嵌入式系统中有ROM和RAM两类内存。 程序被固化进ROM, 变量和堆栈设在RAM中, 用const定义的常量也会被放入ROM。 注:用const定义常量可以节省空间,避免 不必要的内存分配。,内存,1 指针的概念 变量与地址,程序中: int

7、 i; float k;,内存中每个字节有一个编号-地址,.,.,2000,2004,2008,内存,0,i,k,编译或函数调用时为其分配内存单元,变量是对程序中数据 存储空间的抽象,.,.,2000,2004,2008,整型变量i,10,变量i_pointer,指针与指针变量 指针:一个变量的地址 指针变量:专门存放变量地址的变量,2000,指针,指针变量,变量的内容,变量的地址,变量i地址是2000,指针变量i_pointer地址是2004,直接访问与间接访问 直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量,例 i=3; -直接访问,指针变量,2000,3,例

8、*i_pointer=20; -间接访问,20,指针变量,.,.,2000,2008,200C,整型变量i,10,变量i_pointer,2004,2000,整型变量k,例 k=i; -直接访问 k=*i_pointer; -间接访问,10,例 k=i; k=*i_pointer;,2 指针变量: 指针变量与其所指向的变量之间的关系,指针变量的定义 一般形式: 存储类型 数据类型 *指针名;,合法标识符,指针变量本身的存储类型,指针的目标变量的数据类型,表示定义指针变量 不是*运算符,例 int *p1,*p2; float *q ; static char *name;,注意: 1、int

9、*p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值,指针变量的初始化 一般形式:存储类型 数据类型 *指针名=初始地址值;,赋给指针变量,例 int i,j; int *pointer_1,*pointer_2; pointer_1=,一个指针变量只能指向同一个类型的变量,例 float i,j; float *pointer_1,*pointer_2; pointer_1=,例 指针的概念,#include void main() int a; in

10、t *pa= ,例:通过指针变量访问整型变量,#include void main() int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1= ,运行结果; 100,10 100,10,运行结果:a=5,b=9 max=9,min=5,例 输入两个数,并使其从大到小输出,#include void main() int *p1,*p2,*p,a,b; scanf(%d,%d, ,方法:交换指针变量的值,零指针与空类型指针 零指针:(空指针) 定义:指针变量值为零 表示: int * p=0;,p指向地址为0的单元, 系统保证该单元不

11、作它用 表示指针变量值没有意义,#define NULL 0 int *p=NULL:,p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较,例 int *p; . while(p!=NULL) . ,void *类型指针 表示: void *p; 使用时要进行强制类型转换,例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;,表示不指定p是指向哪一种 类型数据的指针变量,指针变量作为函数参数地址传递 特点:共享内存,“双向”传递,void swap(int x,int y) int temp; temp=x;

12、x=y; y=temp; void main() int a,b; scanf(%d,%d, ,例 调用子函数,将数从大到小输出,5,9,5,5,9,COPY,指针变量作为函数参数地址传递 特点:共享内存,“双向”传递,swap(int x,int y) int temp; temp=x; x=y; y=temp; main() int a,b; scanf(%d,%d, ,例调用子函数,将数从大到小输出,值传递,5,9,运行结果:5, 9,void swap(int x,int y) int t; t=x; x=y; y=t; void main() int a,b; int *pointe

13、r_1,*pointer_2; scanf(%d,%d, ,例调用子函数,将数从大到小输出,5,9,2000,2004,COPY,5,5,9,void swap(int x,int y) int t; t=x; x=y; y=t; void main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d, ,例调用子函数,将数从大到小输出,值传递,5,9,运行结果:5, 9,2000,2004,void swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p; void main() int a,b;

14、 int *pointer_1,*pointer_2; scanf(%d,%d, ,5,9,2000,2004,5,9,COPY,5,例调用子函数,将数从大到小输出,swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p; main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d, ,5,9,2000,2004,5,9,例调用子函数,将数从大到小输出,运行结果:9,5,地址传递,方法:交换整型变量的值,例调用子函数,将数从大到小输出,void swap(int *p1, int *p2) int

15、 *p; p=p1; p1=p2; p2=p; void main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d, ,5,9,2000,2004,COPY,2000,2000,2004,void swap(int *p1, int *p2) int *p; p=p1; p1=p2; p2=p; void main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d, ,例调用子函数,将数从大到小输出,值传递,5,9,运行结果:5, 9,2000,2004,void swap(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *p2=*p; void main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d, ,编译警告! 结果不对!,int x; int *p=,例调用子函数,将数从大到小输出,COPY,指针变量在使用前 必须赋值!,例输入a,b,c三个整数,按大小顺序输出,void swap(int *pt1,int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; void exchan

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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