C语言程序设计 教学课件 ppt 作者 许薇 武青海 第七章

上传人:E**** 文档编号:89370311 上传时间:2019-05-24 格式:PPT 页数:25 大小:193.50KB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者  许薇 武青海 第七章_第1页
第1页 / 共25页
C语言程序设计 教学课件 ppt 作者  许薇 武青海 第七章_第2页
第2页 / 共25页
C语言程序设计 教学课件 ppt 作者  许薇 武青海 第七章_第3页
第3页 / 共25页
C语言程序设计 教学课件 ppt 作者  许薇 武青海 第七章_第4页
第4页 / 共25页
C语言程序设计 教学课件 ppt 作者  许薇 武青海 第七章_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 许薇 武青海 第七章》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 许薇 武青海 第七章(25页珍藏版)》请在金锄头文库上搜索。

1、第七章 地址和指针,信息工程学院,第7章 地址和指针,指针是语言中广泛使用的一种数据类型。 如果在程序中定义了一个变量,在对程序进行编译时系统会给这个变量分配内存单元,内存单元编号也叫做地址。 地址和指针的概念 指针变量 指向函数的指针 对指针变量的操作 函数之间地址值的传递 通过实参向函数传递函数名或指向函数的指针变量 传给main函数的参数,7.1 地址和指针的概念,在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占4个字节单元,字符型量占1个字节单元等。为了正确地访问这些内存单元,必须为每个内存单元编上号

2、。根据一个内存单元的编号即可准确地找到该内存单元。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。内存单元的指针和内存单元的内容是两个不同的概念,下面用一个通俗的例子来说明它们之间的关系。用户到银行去存取款时,银行工作人员将根据用户的账号去找存款单,找到之后在存单上写入存款、取款的金额。在这里,账号就是存单的指针,存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。在语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。,7.2 指 针 变 量,7

3、.2.1 指针变量的定义 所谓变量的指针,实际上指变量的地址。变量的地址虽然在形式上好像类似于整数,但在概念上不同于以前介绍过的整数,它属于一种新的数据类型,即指针类型。一般用“指针”来指明这样一个表达式&x的类型,而用“地址”作为它的值,也就是说,若x为一整型变量,则表达式&x的类型是指向整数的指针,而它的值是变量x的地址。同样,若 double d;则&d的类型是指向双精度数d的指针,而&d的值是双精度变量d的地址。所以,指针和地址是用来叙述一个对象的两个方面。虽然&x、&d的值分别是整型变量x和双精度变量d的地址,但&x、&d的类型是不同的,一个是指向整型变量x的指针,而另一个则是指向双

4、精度变量d的指针。在习惯上,很多情况下指针和地址这两个术语混用了。 可以用下述方法来定义一个指针类型的变量。 int *ip;,指针变量的一般定义为 类型标识符 *标识符; 其中标识符是指针变量的名字,标识符前加了“*”号,表示该变量是指针变量;而“类型标识符”表示该指针变量所指向的变量的类型。一个指针变量只能指向同一种类型的变量,也就是说,不能定义一个指针变量,既能指向一整型变量又能指向双精度变量。 指针变量在定义中允许带初始化项,例如: int i,*ip=&i; 这里是用&i对ip初始化,而不是对*ip初始化。,7.2.2 指针变量的引用,指针变量同普通变量一样,使用之前不仅要定义说明,

5、而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,决不能赋予任何其他数据,否则将引起错误。在语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。 两个有关的运算符如下。 (1):取地址运算符。 (2)*:指针运算符(或称“间接访问”运算符)。 语言中提供了地址运算符&来表示变量的地址。 其一般形式为 &变量名; 如&a表示变量a的地址,&b表示变量b的地址。,设有指向整型变量的指针变量p,如要把整型变量a的地址赋予p可以有以下两种方式。 指针变量初始化的方法。 int a; int *p=,我们定义了两个整型

6、变量i、x,还定义了一个指向整型数的指针变量ip。i、x中可存放整数,而ip中只能存放整型变量的地址。我们可以把i的地址赋给ip:ip=&i,【例7-1】指针变量的使用。 main() int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1= ,【例7-2】输入a和b两个整数,按先大后小的顺序输出a和b。 main() int *p1,*p2,*p,a,b; scanf(“%d,%d“, 运行结果: 9,3 a=9,b=3 max=9,min=3,7.3 指向函数的指针,7.3.1 用函数指针变量调用函数 在C语言中,指针变量也可以指

7、向一个函数。我们已经知道代码也是有地址的,一个函数在编译时会被分配给一个入口地址,这个入口地址就是该函数中第1条指令的地址,这就是该函数的指针。当调用一个函数时,除了通过函数名来调用以外,还可以通过指向该函数的指针变量来调用。一个指向函数的指针其初始值不能为空,因为它在使用之前必须被赋予一个真实的函数地址。指向函数的指针变量的一般定义形式如下(其中的函数类型是指函数返回值的类型): 函数类型 (*指针变量名) ();,#include “stdio.h“ #include “math.h“ double func1(double a ,double b) double sum = 0.0; d

8、ouble length = 0.000001; double x = a; while(x b) sum += x*x*0.000001; x+=0.000001; return sum; ,void main() double result = 0.0; double (*p)(double,double); p = func1; result = (*p)(0.0,1.0); printf(“%gn“,result); 运行结果: 0.333333,7.3.2 用指向函数的指针作函数参数,参数型函数指针与一般的函数指针声明相同,只是声明位置不同。一般函数指针可以声明成全局型或区域型变量,

9、而参数型函数指针则直接声明于函数的参数列表中,如下所示: 返回值数据类型 函数名(参数1数据类型,参数2数据类型, 返回值数据类型 (*函数指针名称)(参数1数据类型,参数2数据类型,);,7.4 对指针变量的操作,7.4.1 通过指针来引用一个存储单元 C语言提供了一个称做“间接访问运算符”(也称间址寻址运算符)的单目运算符:“*”。当指针变量中存放了一个确切的地址值时,就可以用“间接访问运算符”通过指针来引用该地址的内存单元。 有以下定义和语句: int *p,i =10;,j; p= 是把p所指定内存单元(i)的内容(整数10)赋予变量j,这里*p代表p所指定的变量i(注意:此处的*号既

10、不是乘号,也不是语句中用来说明指针的说明符)。,若有以下定义语句: int *p,*s,k=20; s=图7-2 变量p.s和k的关系 可以用图来形象地表示p、s和k的关系。 则*s代表存储单元k,*p代表存储单元s,因此*p也代表存储单元k,【例7-5】用指针指向两个变量,通过指针运算选出值小的那个数。 程序如下: #include main() int a,b,min,*pa,*pb,*pmin; pa= scanf(“%d%d“,pa,pb); /*输入的值依次存放入pa、pb所指存储单元中*/ printf(“a=%d b=%dn“,a,b); /*通过输出,验证a、b中的值*/ *p

11、min=*pa; /*假定a中的最小,将其赋给min*/ if(*pa*pb) *pmin=*pb; /*若b中的最小,将其赋给min*/ print(“min=%dn“,min); /*输出小值 */ 当运行程序时输入41 32(此处 代表Enter键),程序输出如下; a=41 b=32 min = 32,7.4.2 指针的移动和比较,1指针移动 所谓移动指针就是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。因此,只有当指针指向一连串连续的存储单元时,指针的移动才有意义。 当指针指向一连串的存储单元时,可以对指针变量加上或减去一个整数的运算,也可以对指向同一串

12、连续存储单元的两个指针进行相减的运算。除此之外,不可以对指针进行任何其他的算术运算。 q=p+2; q+;q+; q-; p+;,2指针比较 在关系表达式中可以对两个指针进行比较。例如,p和q是两个指针变量,以下语句是完全正确的: if (pq) printf (“p points to lower memory than q.n“); if(p=0) printf (“p points to null.n“);,7.5 函数之间地址值的传递,7.5.1 形参为指针变量时参数和形参之间的数据传递,【例7-6】输入的两个整数按大小顺序输出。请用函数处理,而且用指针类型的数据作函数参数。 #inc

13、lude “stdio.h“ int swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; ,main() int a,b; int *pointer_1,*pointer_2; scanf(“%d,%d“, 运行结果: 3,5 5,3,【例7-7】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。 #include int swap(int *p1,int *p2) int *p; p=p1; p1=p2; p2=p; main() int a,b; int *pointer_1,*pointer_2; scanf(

14、“%d,%d“, 运行结果: 2,1 2,1,7.5.2 通过传送地址值在被调用函数中直接改变调用函数中的 变量的值,【例7-9】调用swap( )函数,交换主函数中变量x和y中的数据。 #include void swap(int *,int *); void main () int x=30,y=20; printf(“ (1)x=%d y=%dn“,x,y); swap( ,void swap(int *a,int *b) int t; printf(“ (2)a=%d b=%dn“,*a,*b); t=*a; *a=*b; *b=t; printf(“ (3)a=%d b=%dn“,*

15、a,*b); 运行结果: (1) x=30 y=20 (2) a=30 b=20 (3) a=20 b=30 (4) x=20 y=30,【例7-10】编写函数order(int *a,int *b),使调用函数中的第1个实参总是存放两个数中的较小的数,第2个参数存放两个数中较大的数。,#include void swap(int *x1,int *x2) int t; t=*x1; *x1=*x2; *x2=t; void order(int *a,int *b) if(*a*b) swap(a,b); ,main() int x,y; printf(“Enter x,y:n“); scanf(“%d,%d“, 运行结果: Enter x,y: 3,2 x=3 y=2 x=2 y=3,7.5.3 函数返回地址值,int *fun(int *a,int *b) if(*a*b) return a; return b; 运行结果: Enter two number: 5,12 i=5,j=12,*p=12,【例7-11】以下函数把主函数中变量i和j中存放较大数的那个地址作为函数值传回。 # include int *fun(int *,int *); void main() int *p,i,j; printf(“Enter two number:

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

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

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