第八章指针10年12月15日.ppt
《第八章指针10年12月15日.ppt》由会员分享,可在线阅读,更多相关《第八章指针10年12月15日.ppt(64页珍藏版)》请在三一文库上搜索。
1、2019/9/5,1,第八章 指针,C 语言程序设计,山西大同大学 物电学院,2019/9/5,2,8.1 变量的地址和指针,在程序中,一个变量实质上是代表了“内存中的某个存储单元”。那么C语言是怎样存取这个内存单元的内容的呢? 计算机的内存是以字节为单位的一片连续存储空间,每一个字节都有一个编号,这个编号就是内存地址。就像旅馆的每个房间都有一个房间号一样,如果没有房间号,旅馆的工作人员就无法进行管理。同样的道理,没有内存字节的编号,系统就无法对内存进行管理。因为内存的存储空间是连续的,内存中的地址号也是连续的,并且用二进制来表示,为了直观起见,在这里我们将用十进制数来进行描述。,2019/9
2、/5,3,8.1 变量的地址和指针,若在程序中,定义了一个变量,C编译系统就会根据定义中变量的类型,为其分配一定字节数的内存空间(在VC中,short int型数据占2字节,int型数据、long型数据和float型数据占4个字节, double型数据占8字节, char型数据占2字节, 指针变量占4字节),此后,这个变量的内存地址也就确定了。,2019/9/5,4,main() float x; short y; ,变量的两个物理意义,变量的内容,变量的地址,8.1 变量的地址和指针,2019/9/5,5,main() short a,b,c; a=5; b=3; c=a +b; ,2000
3、 2001 2002 2003 2004 2005,a b c,8,利用变量名存取数据的方式称为“直接存取”方式。,8.1 变量的地址和指针,2019/9/5,6,C 语言还提供了对内存单元的“间接存取”方式,5,3,2004,a和b相加的结果(*p=a+b)存放到变量p所指向的内存单元中去。此时c称为指针变量p的目标变量。,p=&c,8,main() short a=5,b=3,c,*p; p = ,8.2 指针变量,8.2.0 指针变量的概念,变量的地址称为变量的指针 存放地址的变量称为指针变量,2019/9/5,7,8.2 指针变量,8.2.1 指针变量的定义,定义指针的一般形式为: 类
4、型名 *指针变量名1,*指针变量名2,;,例如: int *p,*q;,p和q都是用户标识符。每个变量前的(*)是一个说明符,说明该变量是指针变量,(*)不能省略。int是类型名,在这里说明了p和q是两个指向整型变量的指针,也就是说p和q中只能存放int类型变量的地址。这时我们称int是指针变量p和q的”基类型”。,2019/9/5,8,8.2 指针变量,8.2.1 指针变量的定义,再如: char *ch; float *s,*t;,指针ch的基类型是char类型,所以ch中只能存放char类型变量的地址。同理指针s和t中只能存放float类型变量的地址。,2019/9/5,9,8.2 指针
5、变量,8.2.1 指针变量的定义,short *p,*s,k=20; s=,指向指针的指针变量,2019/9/5,10,main() short a,*p= ,2004,8.2 指针变量,8.2.2 给指针变量赋地址值,2000,指针变量初始化,2019/9/5,11,8.2 指针变量,8.2.3 给指针变量赋“空”值,给指针变量赋“空”值的语句如下: p=NULL;,NULL是在stdio.h头文件中的预定义符,因此在使用NULL时,应该在程序前面写上预定义行: #include “stdio.h”,NULL的代码值为0,所以以上语句可以等价为:p=0;或者p=0;,这时,指针就是并不是指向
6、地址为0的存储单元,而是具有一个确定的值“空”,如果通过业个空指针去访问一个存储单元时,将会得到一个出错的信息。,2019/9/5,12,main() short a,*p= ,间接存取运算,2004,8.3 对指针的操作,8.3.1 引用存储单元,2000,*p = ,5,2019/9/5,13,8.3 对指针的操作,2019/9/5,14,8.3 对指针的操作,2019/9/5,15,8.3 对指针的操作,2019/9/5,16,8.3 对指针的操作,2019/9/5,17,8.3 对指针的操作,2019/9/5,18,8.3 对指针的操作,2019/9/5,19,8.3 对指针的操作,2
7、019/9/5,20,8.3 对指针的操作,2019/9/5,21,8.3 对指针的操作,例8.1 有以下程序 main( ) int a=7,b=8,*p,*q,*r; p= ,程序运行后的输出结果是 A)8,7,8,7 B)7,8,7,8 C)8,7,7,8 D)7,8,8,7,2019/9/5,22,8.4 指针与函数,【例8.2】函数参数的传递 void swap(int a, int b); void main( ) int x,y; x=10;y=20; swap(x,y); printf(“x=%d,y=%dn“,x,y); void swap(int a, int b) int
8、 t; t=a;a=b;b=t; return; ,前面已经讲过,C在函数调用时参数的传递是按照单向值传递的方式,因而在被调用函数中形参的变化不能改变实参变量的值。,2019/9/5,23,8.4 指针与函数,运行结果: x=10 y=20,2019/9/5,24,8.4 指针与函数,#include void swap1(int x, int y); main( ) int a=3,b=5; swap1(a, b); printf(“%d ,%dn“,a,b); void swap1(int x, int y) int t; t=x; x=y; y=t; ,输出: 3,5,2019/9/5,
9、25,8.4 指针与函数,void swap2(int *p1, int *p2); #include main( ) int a=3,b=5; swap2( ,2019/9/5,26,8.4 指针与函数,void swap3(int *p1, int *p2); #include main( ) int a=3,b=5; swap3( ,2019/9/5,27,8.4 指针与函数,void swap2(int *p1, int *p2) int t; t=*p1; *p1=*p2; *p2=t; ,#include main( ) int a=3,b=5; swap2( ,2019/9/5,
10、28,8.4 指针与函数,2019/9/5,29,8.4 指针与函数,2019/9/5,30,8.4 指针与函数,2019/9/5,31,8.4 指针与函数,8.4.1 “传值”与“传址”,1.形参为指针变量时,实参与形参之间的数据传递,【例8.5】有以下程序 #include int f(int *a, int *b) int s; s=*a+*b; return s; main( ) int x=2,y=4,s; s=f( ,若在定义一个函数时,函数的形参为指针变量,则调用该函数时,对应的实参必须是与形参基类型相同的地址值或者已经指向某个存储单元的指针变量。,2019/9/5,32,8.4
11、 指针与函数,8.4.1 “传值”与“传址”,2.通过传递地址值,在被调用函数中直接改变调用函数中的变量值,【例8.6】调用swap函数,交换主函数中变量x和y中的数据。 #include void swap(int *a, int *b) int t; t=*a;*a=*b;*b=t; main( ) int x=10,y=20; printf(“(1)x=%d,y=%dn“,x,y); swap( ,2019/9/5,33,8.4 指针与函数,8.4.1 “传值”与“传址”,【例8.7】有以下程序 #include void f(int y, int *x) y=y+*x; *x=*x+y
12、; main( ) int a=2,b=4; f(b, ,2.通过传递地址值,在被调用函数中直接改变调用函数中的变量值,2019/9/5,34,8.4 指针与函数,8.4.2 函数返回地址值,【例8.8】以下函数把两个整数形参中较小的那个数的地址作为函数值传回。 #include int *fun(int *, int *); main( ) int a,b,*p; scanf(“%d%d”, ,函数返回值的类型不仅仅可以是简单的数据类型,还可以是代表地址值的指针类型。对于返回值为地址,函数的定义与一般函数的定义方式有细微的差别。,2019/9/5,35,2009年9月真题,(26)有以下程序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 指针 10 12 15
链接地址:https://www.31doc.com/p-3506065.html