函数的一些知识

用全程变量实现参数互传
以上两种办法可以在调用函数和被调用函数间传递参数,但使用不太方便。如果将所要传递的参数定义为全程变量,可使变量在整 个程序中对所有函数都可见。这样相当于在调用函数和被调用函数之间实现了参数的传递和返回。这也是实际中经常使用的方法,但定义全程变量势必长久地占用了 内存。因此,全程变量的数目受到限制,特别对于较大的数组更是如此。当然对于绝大多数程序内存都是够用的。
例6:
#incluide<stdio.h>
void disp(void);
int m[10]; /*定义全程变量*/
int main()
{
int i;
printf("In main before calling\n");
for(i=0; i<10; i++){
m[i]=i;
printf("%3d", m[i]); /*输出调用子函数前数组的值*/
}
disp(); /*调用子函数*/
printf("\nIn main after calling\n");
for(i=0; i<10; i++)
printf("%3d", m[i]); /*输出调用子函数后数组的值*/
getch();
return 0;
}
void disp(void)
{
int j;
printf("In subfunc after calling\n");/*子函数中输出数组的值*/
for (j=0; i<10; j++){
m[j]=m[j]*10;
printf("%3d", m[i]);
}
}

函数的递归调用
Turbo C2.0允许函数自己调用自己,即函数的递归调用,递归调用可以使程序简洁、代码紧凑,但要牺牲内存空间作处理时的堆栈。
如要求一个n!(n的阶乘)的值可用下面递归调用:
例8:
#include<stdio.h>
unsigned ling mul(int n);
int main()
{
int m;
puts("Calculate n! n=?\n");
scanf("%d", &m); /*键盘输入数据*/
printf("%d!=%ld\n", m, mul(m));/*调用子程序计算并输出*/
getch();
retun 0;
}
unsigned long mul(int n)
{
unsigned long p;
if(n>1)
p=n*mul(n-1); /*递归调用计算n!*/
else
p=1L;
return(p); /*返回结果*/
}
运行结果:
calculate n! n=?
输入5时结果为:
5!=120

函数作用范围 Turbo C2.0中每个函数都是独立的代码块,函数代码归该函数所有,除了对函数的调用以外,其它任何函数中的任何语句都不能访问它。例如使用跳转语句goto就 不能从一个函数跳进其它函数内部。除非使用全程变量,否则一个函数内部定义的程序代码和数据,不会与另一个函数内的程序代码和数据相互影响。
Turbo C2.0中所有函数的作用域都处于同一嵌套程度,即不能在一个函数内再说明或定义另一个函数。
Turbo C2.0中一个函数对其它子函数的调用是全程的,即是函数在不同的文件中,也不必附加任何说明语句而被另一函数调用,也就是说一个函数对于整个程序都是可见的。
4.函数的变量作用域
在Turbo C2.0中,变量是可以在各个层次的子程序中加以说明,也就是说,在任何函数中,变量说明有只允许在一个函数体的开头处说明,而且允许变量的说明(包括初 始化)跟在一个复合语句的左花括号的后面,直到配对的右花括号为止。它的作用域仅在这对花括号内,当程序执行到出花括号时,它将不复存在。当然,内层中的 变量即使与外层中的变量名字相同,它们之间也是没有关系的。
例9.
#include<stdio.h>
int i=10;
int main()
{
int i=1;
printf("%d\t, i);
{
int i=2;
pritnf("%d\t", i);
{
extern i;
i+=1;
printf("%d\t", i);
}
printf("%d\t", ++i);
}
printf("%d\n", ++i);
return 0;
}
运行结果为
1 2 11 3 2
从程序运行的结果不难看出程序中各变量之间的关系,以及各个变量的作用域。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值