收藏 分享(赏)

《C语言》课件-6.ppt

上传人:jinchen 文档编号:8117687 上传时间:2019-06-09 格式:PPT 页数:28 大小:678.50KB
下载 相关 举报
《C语言》课件-6.ppt_第1页
第1页 / 共28页
《C语言》课件-6.ppt_第2页
第2页 / 共28页
《C语言》课件-6.ppt_第3页
第3页 / 共28页
《C语言》课件-6.ppt_第4页
第4页 / 共28页
《C语言》课件-6.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、第6章 函数,1.,2.,3.,本章讲述内容:,定义函数的方法 ;,编写程序时,调用函数和被调函数的位置关系 ;,调用函数和被调函数间数据传递的各种方式 ;,程序中各个变量的作用域和生命期 。,4.,6.1 函数的概念,6.1.1 函数的定义,.,所谓“函数”,是可以反复使用的一个程序段,其他函数可通过调用语句来执行这段程序,完成所需要的工作。,.,C语言为用户提供的函数,称为“系统函数”。它们事先已经定义,通过包含语句将其所在的头文件包含进来,程序中就可直接调用了。用户自己编写的函数,是“用户函数”。用户函数事先并不存在,所以在使用前,必须先进行定义。,.,C语言总是遵循“先说明后使用”的原

2、则。因此在调用一个函数前,应在调用函数中,先对被调函数进行说明(即函数原型说明),然后再行调用。不过,只要在编写程序时,注意安排被调函数和调用函数的位置,可以省略对被调函数的说明。,为了实施函数的功能,有时被调用者需从调用者那里接收传递过来的数据信息,这些信息被称为“参数”。有参数的函数,称为“有参函数”,否则称为“无参函数”。,.,.,函数定义的一般格式是:, () ,函数类型:所定义函数执行完后返回结果的数据类型,它可是基本数据类型,也可是指针型的。若一个函数在执行后不返回任何结果值,那么其应指定为void。若定义函数时,省略了函数类型,那将默认为是int的。,(1),(2),函数名:是所

3、定义函数的名称,它可是任何合法的标识符。注意,在一个程序中,函数名必须是唯一的,别的函数都通过函数名来调用函数。,(3),形式参数表:是括在圆括号里的、由“类型参数”对组成的参数表,每对间用逗号隔开。参数是变量名,类型给出后面那个参数的数据类型。形式参数表中列出的形式参数,简称“形参”。被调函数通过这些形参,接收从调用函数传递过来的数据。无论所定义的函数有无参数,函数名后的圆括号都不能省略。,(4),函数体:函数体由一对花括号“ ”括起,它由变量说明语句和执行语句序列组成。右花括号的后面不能有分号。,例:,理解如下定义的函数:,long cube (int x) long a;a = x*x*

4、x;return (a); ,cube为函数名,执行后的返回值是long型的。它有一个int型的参数,名为x。在函数体里,说明一个变量a,x的立方值存放在它里面。最后由 “return(a);”语句将a中的内容返回。,.,.,函数类型long与return语句的返回值应前后呼应,即long规定了这个函数的返回值类型,return就应该把这种类型的值返回。,.,该函数只是给出计算一个整型变量立方值的抽象方法。因此,它自己不能独立运行,必须由调用者(比如函数main() )通过调用语句,把要计算的对象传递给它。,定义一个函数,有一个int型参数,功能是若接收的参数是偶数,则输出信息“It is e

5、ven!”,否则输出信息“It is odd!”。,定义有3个整型参数的函数,功能是返回这3个参数中的最大者。,例:,int max (int x1, int x2, int x3) int temp;if (x1 x2)temp = x1;elsetemp = x2;if (temp x3)temp = x3;return (temp); ,例:,3个参数是x1、x2、x3。函数体里的temp是工作变量,用它存放比较后的大者,最后它的里面是x1、x2、x3三者中的最大值。通过return语句把它的值返回。,.,void odd_even (int x) if (x %2 = 0)printf

6、 (“It is even!n“);elseprintf (“It is odd!n“); ,.,由于没有要求返回什么信息,所以可把函数的类型定义为是void的。因此,函数里也就可以不安排“return”语句。对于没有“return”语句的函数,在运行到函数体的最后一条语句后,会自动返回到调用它的函数。,.,判断一个整数是否为偶数的条件是:x%2=0 程序正是利用它来决定输出什么信息的。,6.1.2 函数的调用,.,函数被定义后,只有在调用函数里安排函数调用,才能将控制从调用者转移到被调函数,也才能进行数据的传递。,.,调用者在函数调用时,可向被调用者传递一个或多个参数。由调用者传递给被调函数

7、的参数,称为“实际参数”,简称“实参”。被调函数接收传递过来的实参后,依据这些数据执行函数体里的语句。执行结束后,就把控制返回到调用者发出函数调用的地方,继续其执行。,.,没有返回值的函数,是以函数调用语句的方式进行调用的。即:,.,无论是有返回值还是没有返回值,函数调用时在实际参数表中列出的实参,必须与被调函数在定义中里所列的形参个数相等、类型相符、次序相同,各实参之间仍以逗号为分隔符。,有返回值的函数,是以函数表达式的方式调用的。即:,., ();,注意,这是一个语句,必须要以分号结尾。, (),注意,这是表达式,凡是一般表达式能够出现的地方,它都可以出现。,例:,编写一个main()函数

8、,用具体的数据调用前例里定义的函数max(),验证函数max()的正确性。,(1),程序实现,#include “stdio.h“ int max (int x1, int x2, int x3) int temp;if (x1 x2)temp = x1;elsetemp = x2;if (temp x3)temp = x3;return (temp); ,main() int a, b, c, m;printf (“Please enter three integers:“);scanf (“%d%d%d“, ,(2),分析与讨论,程序从main()开始执行。通过printf()语句的提示,

9、由scanf()输入3个整数之后,通过语句:m = max (a, b, c); 对函数max()进行调用。,调用,返回,.,.,调用时,调用函数把实参a,b,c的值传递给被调函数max()。max()接收到它们后,就把值对应地赋给形参x1、x2、x3,并以这些值作为操作对象加以比较,把其中的最大者存入temp,通过“return(temp);”语句将结果返回给调用者的变量m接收。,编写main()函数,用具体的数据调用前例里定义的函数odd_even(),验证函数odd_even()的正确性。,例:,(1),程序实现,#include “stdio.h“ void odd_even (int

10、 x) if (x %2 = 0)printf (“It is even!n“);elseprintf (“It is odd!n“); ,main() int t;char ch;doprintf (“Please enter a number:“);scanf (“%d“, ,(2),分析与讨论,.,程序从main()开始执行。输入整数后,以实参t去调用odd_even()。,.,由于odd_even()无返回值,所以对它的调用是以语句的形式出现的。调用完毕控制返回main()。,只要输入的是y,就继续进行下一次验证,这由do while语句最后的“ while (1) ”决定。在往ch里

11、输入非y后,由“break;”语句强制结束循环,从而结束整个程序的运行。,.,.,程序连续运行3次时的结果,如图所示。,调用,返回,main() double a, pow;int i;printf (“Please enter a real number and an integer:“);scanf (“%lf%d“, ,例:,(1),程序实现,(2),分析与讨论,定义名为power的函数,它以双精度实数x和正整数n为参数,计算x的n次方,返回该值。编写main()函数,调用power(),验证它的正确性。,#include “stdio.h“ double power (double x

12、, int n) double s;if (n0)for (s=1.0; n0; n-)s = s*x;s = 1.0;return (s); ,.,由于是计算双精度实数x的n次方,然后加以返回。所以,所要定义的 power()函数应该是double型的。,.,程序从main()开始执行。在往a和i里输入数据后,以它们为实参在赋值语句:pow = power(a, i); 的右边调用函数power()。,.,power()接收实参后,将实参的值赋给自己的形参x和n,以此执行函数体中的语句。计算结果在s里,并返回给调用者。,调 用,返 回,例:,(1),程序实现,(2),分析与讨论,编写判断一个

13、自然数是否是素数的函数,并利用它求出100以内所有的素数。,#include “stdio.h“ int prime (int n) int i;if (n = 1)return (0);else if (n = 2)return (1);elsefor (i = 2; in; i+)if (n % i = 0)return (0);return (1); ,main() int j = 0, k, x;for (x = 1; x=100; x+)k = prime (x);if (k = 1)printf (“%dt“, x);+j;if (j %5 = 0)printf (“n“); ,.

14、,所谓素数是指只能被1和自己整除的自然数(1除外)。,.,在prime()中,接收调用者传递来的一个自然数。先把n为1的情况剔除,再单独处理n为2的情况,,然后用循环来判断从2到n1之间是否存在能整除n (注意,比n大的数当然不可能整除n)的数。若有,则表明n不是素数,返回值0;否则n为素数,返回值1。,.,main()由for循环,调用函数prime()共100次。每次调用后,总是把返回值送入变量k。只有k取值为1时,才表明调用时的实参x是一个素数,因此也才把它打印出来。,.,从形式上看,所编写的函数prime()里有4条return语句。其实,在只能有一条return语句被执行。任何函数只

15、能通过return语句,向调用者传递一个结果,而不是多个。,调用一个用户函数时,必须先保证被调用的用户函数已经存在。所以在上面所举的每个例子里,都是把被调函数放在了调用者的前面。,6.1.3 函数的原型说明,.,.,若调用和被调用函数的位置颠倒了,当被调函数返回值类型是int、char时,不会有什么关系;若被调函数返回值的类型是float、double或void等,那么编译时就会给出出错信息。,C语言有两种解决的办法:一是把被调用者与调用者的位置重新放正确;二是保持这种颠倒的位置关系,但在整个程序最前面或在调用函数里先对被调函数做一个说明,这就是所谓的“函数原型说明”。,.,.,函数原型说明的

16、一般格式是:,.,函数原型说明与函数定义中的函数头有两点区别:一是函数定义中函数头里给出的是形式参数表,它由“类型参数”对组成,函数原型说明里给出的是形参类型表,它只列出“类型”;二是函数原型说明要以分号为结尾,成为一条说明语句。,通常,函数原型说明一般放在函数main()的开头,或者放在所有函数定义之前。如果程序中要对多个函数进行原型说明,那么最好集中放在一起,并且放在所有函数的外面。必须注意的是,每个函数原型说明的末尾都要有一个分号。,., ();,编写函数triangle(),它有两个形参:字符型的ch ,整型的n 。功能是显示由所给字符组成的三角形(即第1行显示一个字符,第2行显示两个

17、字符,第n行显示n 个字符。最后用函数main()进行验证。,#include “stdio.h“ void triangle (char ch, int n); main() int num;char x;printf (“Enter a character and an integer:n“);scanf (“%c%d“, ,由于triangle()是void型的,又放在调用者后,故在程序开头,对它做函数原型说明。,例:,(1),程序实现,(2),分析与讨论,void triangle (char ch, int n) int i, j;for (i=1; i=n; i+)for (j=1

18、; j=i; j+)putchar (ch);putchar (n); ,函数原型说明,函数 定义,.,.,注意正确使用函数原型说明:原则上应先给出被调函数的定义,然后调用者再去调用;若被调函数的返回值是int或char型的,那么编程时它无论出现在调用者前还是后,都不会引起语法错误;若被调函数的返回值不是int 型或char型,那么编程时它必须安排在调用者的前面,或在对它进行函数调用前 ,先给出关于它的函数原型说明,否则会出现语法错。,在某函数(或复合语句)里面。这种变量称为“局部变量”,它只能在说明它的范围内使用。即凡在一对花括号内说明的变量,就是局部变量,它只能在该括号内使用。出了这个括号

19、,该变量就不能使用了。,在所有函数之外。这种变量称为“全局变量”,它可被程序中的所有函数使用。,6.1.4 变量的作用域与生命期,1.,全局变量、局部变量与变量的作用域,编程时,允许说明变量的3个地方,.,(1),(2),(3),作为函数的形参。这类变量也是局部变量,其作用就是用于接收调用者传递过来的实参数据。越出了函数范围,该变量就不能使用了。,在C语言中,称一个变量的作用范围为“变量的作用域”。由于每个变量都有自己的作用域,因此在不同函数内说明的局部变量可使用相同的变量名,类型也可以不一样,它们不会因为名字相同而互相干扰。,.,.,C语言规定,在一个源程序文件中,当所说明的全局变量与某个函

20、数内说明的局部变量同名时,那么在该局部变量的作用域,全局变量就不起作用。,分析下面程序中有相同变量名的3个局部变量k各自的作用域,以及当scanf()中往k里 输入数据50后, 4条printf ()语句的 输出结果。,例:,#include “stdio.h” main() int k;printf(“Enter an integer:”);scanf(“%d”, ,If中说明的 k的作用域,else中说明 的k的作用域,main()中说明 的k的作用域,.,在进入main()时,说明了第1个变量k;在进入if时,说明了第2个变量k;在进入else时,说明了第3个变量k。,.,第1个k的作用

21、域应是除去if和else两个复合语句以外的整个范围;第2个k的作用域是说明它的那个if的复合语句;第3个k的作用域是说明它的那个else的复合语句。,.,第1条printf()打印出:1-in entry k is 50;第2条printf()打印出:2-in if k is10;第3条printf()不做;第4条printf()打印出:4-in exit k is 50。,main()调用fun()时,fun()又调用了display()。这种在函数调用过程中又发生函数调用的情形,在C语言里称为“函数的嵌套调用”。,由于函数main() 在程序的最前面,它要调用的函数display()和fu

22、n()都是void型的,因此在程序的开头,要对这两个函数做函数原型说明。,例:,阅读下面的程序,给出其执行结果。,#include “stdio.h“ int gol; void fun(); void display(int); main() int num = 10;gol = 150;num = num + gol;display (num);fun (); ,void fun () int num = 20;int gol = 80;num = num +gol;display (num); ,void display (int x) printf (“The number is %d

23、n“, x); ,.,该程序在所有函数之外说明了一个int型变量gol,故它是全局变量,它在3个函数main()、display()、fun()里都起作用。,.,.,在main()里说明一个整型变量num,它的作用域是函数main(),在别的函数里是不起作用的。,.,在函数fun()里说明了名为num和gol的两个整型变量:num与main()中的num同名,gol与全局变量gol同名。但进入fun()后,就是这两个新说明的num和gol起作用,main()里的num和全局变量gol都不起作用。,.,在函数中遇到auto型或没给出存储类型的变量时,C语言就在动态存储区为它们分配所需的存储区。函

24、数调用完毕,就立即收回它们占用的存储区。可见,每次调用函数,都必须重新对自动型变量分配存储区,重新进行初始化。,2.,自动变量、静态变量与变量的生命期,.,有关变量存储类型的知识,(1),(2),在函数内说明一个变量的存储类型为static时,那么它是静态型的,C语言将在静态存储区里为它们分配所需的存储区,即使函数调用结束,也不收回该存储区,而要到程序运行结束。可见,这样的函数无论被调用多少次,静态变量总是使用原先分配给它的存储区。因此,若说明静态变量时对它做了初始化(或取系统的默认初始值),那么这种初始化只做一次,下次再调用就只是沿用上次调用后的遗留值,不再初始化了。,由此可知,自动变量具有

25、临时性:进到说明它的函数里,它就存在、可用;出了它的作用域,它就消亡(即收回分配给它的存储区)。静态变量具有永久性:进到说明它的函数里,它就存在可用;出了它的作用域,它虽不能使用了(因它是局部变量,别的函数是不能用它的),但它仍然存在(即它仍占据着分配给它的存储区)。,.,在C语言中,称一个变量说明后它存在的时间区间为“变量的生命期”。,.,.,对于自动变量,它只在其作用域里存在,出了作用域就不存在了,因此自动变量的生命期就是它的作用域;对于静态变量,在它的作用域里存在,出了作用域它仍然存在(只是不能使用),因此静态变量的生命期比它的作用域来得大。,例:,分析下面的程序,理解一般局部变量与静态

26、局部变量之间的区别。,#include “stdio.h“ void fun() static int x=1;auto int y=1;printf (“x=%dty=%dn“, x, y);x+;y+;printf (“x=%dt y=%dn“, x, y);printf (“- - - - - - - - - - - - - - -n“); ,main() int j;for (j=1; j=3; j+)fun (); ,.,函数main()循环调用函数fun()3次。,.,在fun()里,说明一个static变量x,初值为1;说明一个auto变量y,初值也为1。,.,main()每次调

27、用fun() 时,第1条printf 语句总是打印出进入fun()时的情形;第2条printf语句总是打印出对x,y各自做了“+”操作后的情形。,.,每次进入fun(),先是执行为y赋初值的语句。正是因为如此,3 次循环中的第1条printf语句打印出的都是“y=1”。,.,每次进入fun(),x总是继承上次的运行结果:第1次x=1,是初值;第2次x=2,是上次“+”后的结果;第3次x=3,也是上次“+”后的 结果。可见,对静态局 部变量,赋初值操作只 做一次。在两次调用之 间,它将保持原有的值。,.,程序一次运行的结果, 如图所示。,例:,阅读下面的程序,给出运行结果。,#include “

28、stdio.h“ main() int k;for (k=0; k10; k+)printf (“%d: “, k+1);printf (“n%m=%4d “, nums( ); printf (“n“); ,int nums () static int m, n;printf (“m=%4d n=%4d“, m, n);m += 4;n += 7;printf (“m=%4d n=%4d“, m, n);return (n%m); ,.,main()调用nums()。因nums()是int型的,所以虽它的定义在main()的后面,但C语言是认可的。,.,main()通过循环调用nums()1

29、0次,打印10个n%m的计算结果。nums()里说明的变量m和n都是static型的。要求每次进入和返回时,都输出它们的值。,.,程序中语句“printf (”m=%4dn=4d“, m, n);”里“%”后的负号,表示将输出的数据进行左对齐(没有符号时是右对齐)。,.,程序中语句“printf (“n%m=%4d “, nums( );”里,为输出时能打印出“n%m”而安排了两个“%”。因为如果只放一个“%”,C语言就认为它是以“%”开头的格式说明符,于是printf ()就无法正确工作。,6.2.1 参数是普通变量时的数据传递过程,6.2 函数调用中的数据传递,.,函数调用时,调用者通过实

30、参把所需加工的数据传递给被调函数。被调用者用相同类型的形参接收传递过来的数据,并对其进行加工处理。被调函数可以通过return()语句向调用者返回数据。,当调用者与被调用者之间是以普通变量作为参数进行数据传递时,调用者是把实参变量的值赋给被调用者的形参变量的。,.,.,实参变量和形参变量占用的是内存中不同的存储区,被调函数对形参的加工,是在形参变量自己的存储区里进行的,所以不会去改变和影响到实参变量。,.,被调用者如果要返回信息给调用者,只能通过return语句,不能借助于形参变量或实参变量。所以,称这种数据传递是“单向的”。,#include “stdio.h“ int add (int x

31、, int y) int z;printf (“ ,例:,通过下面的程序,理解在函数参数为普通变量时,传递数据的过程。,main() int a, b, c;printf (“Please enter two integers: “);scanf (“%d%d“, ,.,在main()中,通过语句:c = add(a, b); 调用函数add()。,.,函数add()由形参x和y(是该函数的局部变量)接收实参传递过来的信息。,.,程序的一次运行如图所示。,6.2.2 参数是指针时的数据传递过程,例:,通过下面的程序,理解在函数参数为指针变量时,传递数据的过程。,#include “stdio.

32、h“ void add (int *p) printf (“ ,main() int x, *px= ,.,程序运行如图所示。,.,当调用与被调用者间以指针变量为参数进行数据传递时,调用者把实参指针的值赋 给被调用者的形参指针。 于是,实参指针和形参指 针虽在不同存储区,但内 容却相同,即它们是指向内存同一 存储区的两个不同的指针。,.,于是,被调函数中对 形参所指变量的任何处 理,即是对实参所指变 量做相同的处理。因此,从被调函数返回调用者时,处理结果就在实参指针所指变量里。调用者和被调用者通过共同指向的存储区,“双向地”传递了信息:调用者通过该区,把要加工的信息传递给被调用者;被调用者又通

33、过该区,将加工完的结果传递给调用者。,例:,编写一个程序,以指针变量为函数间的调用参数,实现将所输入字符串s的字符全部首尾调换。,(1),程序实现,#include “stdio.h“void reverse (char *);main()char *ps;printf (“Please enter a string: “);gets (ps);reverse (ps);printf (“%sn“, ps);,void reverse (char *q)int k;char ch, *p;k = strlen (q);for (p=q+k1; qp; q+, p-) ch = *q;*q =

34、*p; *p = ch;,.,程序运行如图所示。,.,设计思想是:在main()里,接收用户输入的字符串,让一个指针指向它。然后以该指针为实参,调用字符串字符全部首尾调换的函数reverse()。,.,由于事先不知道所输入字符串的长度,因此reverse()还要以指向字符串的指针为参数调用计算字符串长度的strlen()函数。注意,这里没有直接使用C语言向我们提供的strlen()库函数。,int strlen (char *t )int n=0;while (*t+ != 0)n+;return (n);,(2),分析与讨论,第1种格式有一个形参,适用于传递长度固定的数组;第2种格式有两个形

35、参,适用于处理可变长的数组,数组的实际长度由第2个参数传递。,此时,实参数组a和形参数组x使用同一个存储区。由此可知,被调函数若改变了形参数组中某元素的值,也就改变了实参数组中相应元素的值。,6.2.3 参数是数组名时的数据传递过程,.,以数组为参数在函数间进行数据传递时,被调函数的函数头一般有两种格式:,1.,以长度固定的数组作为函数参数,例:,分析下面的程序示例。,#include “stdio.h“ main() int a10=1,2,3,4,5,6,7,8,9,10;int sum;printf (“a=%un“, a);printf (“ ,int add (int x10) in

36、t k, temp=0;printf (“x=%un“, x);printf (“ ,.,程序的运行结果如图所示。,., ( )( , int ),2.,以非固定长度数组作为函数参数,例:,分析下面的程序示例。,#include “stdio.h“ void gen(int x , int n) int j;printf (“x=%un“, x);printf (“ ,main() int a20, k;printf (“Please enter number of element: “);scanf (“%d“, ,.,程序的运行结果如图所示。,.,结论:以数组为参数在函数间传递数据时,实参

37、与形参共享同一个存储区。因此,必须考虑在被调函数函数体内对形参数组所做的操作,因为它有可能会影响到实参数组元素的值。,若被调函数没有返回值,那么它可以省略return语句。这时,程序运行到函数体的最后一条语句后,会自动返回到调用它的函数去。,6.2.3 返回语句return,.,返回语句return都出现在被调函数中,它的作用是返回调用者,并向调用者传递计算结果。,.,返回语句的两种使用格式:,.,关于return语句的几点注意,(1),(2),一个函数中可有多条return语句,程序执行到哪条return语句,哪条return语句就起作用,但一个函数的一次运行,只能执行其中的一条return

38、语句。,(3),调用函数是通过被调函数中的return语句得到它的返回值的。所以,如果被调函数是有返回值的,那么它的函数体里面必须要有格式2的return语句。,(4),被调函数只能通过return语句返回一个值。如果要返回多个值,那只有借助于函数间传递的指针参数或数组。,格式1:return; 格式2:return ();,第1种格式用于无返回值的被调函数,只起返回调用者的作用;第2种格式一方面返回调用者,同时把圆括号里的值传递给调用者。,例:,编写计算实数除法的函数div()。功能是当除数不为0时,返回计算结果;否则不做计算,只打印信息:problem with parameter!。在函

39、数main()里,接收两个实数,调用div()加以验证。,(1),程序实现,(2),分析与讨论,#include “stdio.h“float div (float x, float y)if (y = 0)return(0);elsereurn (x/y);,main()float a, b, c;printf (“Please enter two real numbers: “);scanf (“%f%f“, %a, %b);c=div(a, b);if (c != 0)printf (“a/b=%5.2fn“, c);elseprintf (“problem with parameter

40、!n“); ,.,程序的两次运行结果如图所示。第1次是正常情况下的运行,第2次是除数为0时的情形。,.,函数div()里有两条return语句,但只能是做“return(0);”或“reurn (x/y);”。,6.3 指针型函数,.,如果函数的返回值是一个指针(地址),那么就说这个函数是返回指针的函数,即“指针型函数”。,.,调用指针型函数时,在调用者里接收返回值的必须是指针变量,或是指针数组元素等,而不能是其他。,6.3.1 指针型函数的定义方法,指针型函数的定义格式为:,.,比如,有如下函数定义:float *fun (int x, float y) 表示名为fun的函数有两个形式参数:

41、x是int型的,y是float型的。该函数返回一个float型的指针(地址)。,., * () ,定义中出现的“*”,只表明这是一个返回指针的函数,并不是函数名的一部分。,6.3.2 指针型函数的使用,.,关于指针型函数使用的几点注意,(1),(2),对指针型函数进行调用之后,要把它的返回值赋给相同指针类型的变量。,例:,(1),程序实现,(2),分析与讨论,编写一个函数,它有两个整型参数,功能是判断它们中谁大,把大者返回调用者,并打印输出。,#include “stdio.h“ int large1 (int x, int y) if (xy)return (x);return (y);,i

42、nt *large2 (int *x, int *y)if (*x*y)return (x);return (y);,main()int a, b, c, *p;printf (“Please enter two integers: “);scanf (“%d%d“, ,可用两种方法来编写这个函数,一是让它返回整型值,另一是让它返回一个指针。很明显,对它们的调用不一样。程序中把这两个函数放在了一起进行比较。,.,例:,(1),程序实现,(2),分析与讨论,编写一个函数,它接收传递过来的一个整数值,返回该值所对应的月份英文名。比如接收的是10,那么返回十月的英文名“October”。由于英文名是

43、一个字符串,所以返回的实际是该字符串的地址(指针)。,#include “stdio.h“char *m_name(int);main()int x;char *ptr;printf (“Please enter a number: “);scanf (“%d“, ,char *m_name (int k) char *name =“illegal month“, “January“, “February“, “March“, “April“, “May“, “June“, “July“, “August“, “September“, “October“, “November“, “December“;if (k12)return (name0); elsereturn (namek); ,.,注意:定义的函数m_name()是指针型的,不是char型的。由于它在函数main()的后面,违反了“先定义后使用”的规则。因此,在程序的前面必须给出关于它的函数原型说明。如果没有这个说明,程序就通不过编译。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报