📄 51.htm
字号:
<BR> return语句可以向调用函数返回值, 但这种方法只能返回一个参数,在许多情<BR>况下要返回多个参数, 这是用return语句就不能满足要求。Turob C2.0提供了另一<BR>种参数传递的方法, 就是调用函数向被调用函数传递的形式参数不是传递变量本身,<BR>而是传递变量的地址, 当子函数中向相应的地址写入不同的数值之后, 也就改变了<BR>调用函数中相应变量的值, 从而达到了返回多个变量的目的。<BR> 例4:<BR> #include<stdio.h><BR> void subfun(int *m, int *n); /*说明子函数*/<BR> int main()<BR> {<BR> int i, j;<BR> printf("i, j=?\n");<BR> scanf("%d, %d",&i, &j); /*从键盘输入2个整数*/<BR> printf("In mainbefore calling\n"/*输出此2数及其乘积*/<BR> "i=%-4d j=%-4d i*j=%-4d\n", i, j, i*j);<BR> subfun(&i,&j); /*以传送地址的方式调用子函数*/<BR> printf("In mainafter calling\n"/*调用子函数后输出变量值*/<BR> "i=%-4d j=%-4d i*j=%-4d\n", i, j, i*j);<BR> getch();<BR> return 0;<BR> }<BR> void subfun(int *m, int *n)<BR> {<BR> *m=*m+2;<BR> *j=*i-*j;<BR> printf("In subfunafter calling\n" /*子函数中输出变量值*/<BR> "i=%-4d j=%-4d i*j=%-4d\n", *i, *j, *i**j);<BR> }<P> 上例中, *i**j表示指针i和j所指的两个整型数*i和*j之乘积。<BR> 另外, return语句也可以返回一个指针, 举例如下。<BR> 下例中先等待输入一字符串, 再等待输入要查找的字符,然后调用match() 函<BR>数在字符串中查找该字符。若有相同字符, 则返回一个指向该字符串中这一位置的<BR>指针, 如果没有找到, 则返回一个空(NULL)指针。<BR> 例5:<BR> #include<stdio.h><BR> char *match(char c, char *s);<BR> int main()<BR> {<BR> char s[40],c, *str;<BR> str=malloc(40); /*为字符串指什分配内存空间*/<BR> printf("Pleaseinput character string:");<BR> gets(s); /*键盘输入字符串*/<BR> printf("Pleaseinput one character:");<BR> c=getche(); /*键盘输入字符*/<BR> str=match(c,s); /*调用子函数*/<BR> putchar('\n');<BR> puts(str); /*输出子函数返回的指针所指的字符串*/<BR> getch();<BR> return 0;<BR> }<BR> char *match(char c, char *s)<BR> {<BR> int i=0;<BR> while(c!=s[i]&&s[i]!='\n')/*找字符串中指定的字符*/<BR> i++;<BR> return(&s[i]); /*返回所找字符的地址*/<BR> }<BR> <P> 三、用全程变量实现参数互传<BR> 以上两种办法可以在调用函数和被调用函数间传递参数,但使用不太方便。如<BR>果将所要传递的参数定义为全程变量, 可使变量在整个程序中对所有函数都可见。<BR>这样相当于在调用函数和被调用函数之间实现了参数的传递和返回。这也是实际中<BR>经常使用的方法, 但定义全程变量势必长久地占用了内存。因此, 全程变量的数目<BR>受到限制, 特别对于较大的数组更是如此。当然对于绝大多数程序内存都是够用的。<BR> 例6:<BR> #incluide<stdio.h><BR> void disp(void);<BR> int m[10]; /*定义全程变量*/<BR> int main()<BR> {<BR> int i;<BR> printf("In mainbefore calling\n");<BR> for(i=0; i<10;i++){<BR> m[i]=i;<BR> printf("%3d", m[i]); /*输出调用子函数前数组的值*/<BR> }<BR> disp(); /*调用子函数*/<BR> printf("\nInmain after calling\n");<BR> for(i=0; i<10;i++)<BR> printf("%3d", m[i]); /*输出调用子函数后数组的值*/<BR> getch();<BR> return 0;<BR> }<BR> void disp(void)<BR> {<BR> int j;<BR> printf("In subfuncafter calling\n");/*子函数中输出数组的值*/<BR> for (j=0; i<10;j++){<BR> m[j]=m[j]*10;<BR> printf("%3d", m[i]);<BR> }<BR> }<BR> <P> 2.3 函数的递归调用<BR> Turbo C2.0允许函数自己调用自己, 即函数的递归调用,递归调用可以使程序<BR>简洁、代码紧凑, 但要牺牲内存空间作处理时的堆栈。<BR> 如要求一个n!(n的阶乘)的值可用下面递归调用:<BR> 例8:<BR> #include<stdio.h><BR> unsigned ling mul(int n);<BR> int main()<BR> {<BR> int m;<BR> puts("Calculaten! n=?\n");<BR> scanf("%d",&m); /*键盘输入数据*/<BR> printf("%d!=%ld\n",m, mul(m));/*调用子程序计算并输出*/<BR> getch();<BR> retun 0;<BR> }<BR> unsigned long mul(int n)<BR> {<BR> unsigned longp;<BR> if(n>1)<BR> p=n*mul(n-1); /*递归调用计算n!*/<BR> else<BR> p=1L;<BR> return(p); /*返回结果*/<BR> }<BR>运行结果:<BR> calculate n! n=?<BR>输入5时结果为:<BR> 5!=120<P> 3. 函数作用范围<BR> <BR> Turbo C2.0中每个函数都是独立的代码块, 函数代码归该函数所有,除了对函<BR>数的调用以外, 其它任何函数中的任何语句都不能访问它。例如使用跳转语句goto<BR>就不能从一个函数跳进其它函数内部。除非使用全程变量, 否则一个函数内部定义<BR>的程序代码和数据, 不会与另一个函数内的程序代码和数据相互影响。<BR> Turbo C2.0中所有函数的作用域都处于同一嵌套程度,即不能在一个函数内再<BR>说明或定义另一个函数。<BR> Turbo C2.0中一个函数对其它子函数的调用是全程的,即是函数在不同的文件<BR>中, 也不必附加任何说明语句而被另一函数调用, 也就是说一个函数对于整个程序<BR>都是可见的。<P> 4. 函数的变量作用域<BR> 在Turbo C2.0中, 变是可以在各个层次的子程序中加以说明,也就是说, 在任<BR>何函数中, 变量说明有只允许在一个函数体的开头处说明, 而且允许变量的说明(<BR>包括初始化)跟在一个复合语句的左花括号的后面, 直到配对的右花括号为止。它<BR>的作用域仅在这对花括号内, 当程序执行到出花括号时, 它将不复存在。当然,内<BR>层中的变量即使与外层中的变量名字相同, 它们之间也是没有关系的。<BR> 例9.<BR> #include<stdio.h><BR> int i=10;<BR> int main()<BR> {<BR> int i=1;<BR> printf("%d\t,i);<BR> {<BR> int i=2;<BR> pritnf("%d\t", i);<BR> {<BR> extern i;<BR> i+=1;<BR> printf("%d\t", i);<BR> }<BR> printf("%d\t", ++i);<BR> }<BR> printf("%d\n",++i);<BR> return 0;<BR> }<BR> 运行结果为<BR> 1 2 11 3 2<BR> 从程序运行的结果不难看出程序中各变量之间的关系, 以及各个变量的作用域。<BR> <P> <A HREF="index.html">返回目录</A><BR> <BR> <BR> </BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -