函数
1函数的嵌套调用
C语言不能嵌套定义函数,但可以嵌套调用函数,即允许在调用一个函数的过程中,又调用另一个函数。例如:
例如下面的汉偌塔问题:
2数组作为函数参数
数组元素作函数参数
数组名作函数参数
多维数组名作函数参数
(1)数组元素作函数实参
例1:输入一行字符,分别统计出其中大写字母和 小写字母的个数。
#include “stdio.h”
main()
{char a[30];
int i, k=0, p=0;
gets(a);
for(i=0; a[i]!=‘\0’; i++)
{ if(fun(a[i])==1) k++;
if(fun(a[i])==2) p++; }
printf(“大写字母个数:%d”, k);
printf(“小写字母个数:%d”, p);
}
int fun(char x )
{ if(x>=’A’&&x<=‘Z’)
return 1;
if(x>=’a’&&x<=‘z’)
return 2; }
(2)数组名作函数实参
- 用数组名作函数参数,应该在主调函数和被调函数分
别定义数组。
-
实参——数组名 形参——数组名或指针变量
-
实参数组与形参数组类型应一致。
-
系统将实参数组的首地址传给形参数组
-
用数组名作函数参数时,形参数组的改变也可以使实
参数组随之改变。
例2:有一个一维数组score,内放10个学生成绩,求平均成绩。
float fun(float a[10]);
main()
{ float s[10],ave;
int i;
for(i=0;i<10;i++)
scanf(“%f ”,&s[i]);
ave=fun(s);
printf(“ave=%.2f ”,ave);
}
float fun(float a[10] )
{ int i;
float sum=0,aver;
for(i=0;i<10;i++)
sum=sum+a[i];
aver=sum/10;
return aver;
}
例3:编写函数,用选择排序对数组中的10个数按由小到大排序。
void fun(int b[ ])
{ int i, j, k, t;
for(i=0; i<9;i++)
{ k=i;
for(j=i+1; j<10;j++)
if(a[k]>a[j]) k=j;
if(k!=i)
{ t=a[i];
a[i]=a[k];
a[k]=t;}
}
}
main()
{ int a[10], i;
for(i=0; i<10; i++)
scanf(“%d”,&a[i]);
fun(a);
for(i=0;i<10;i++)
printf(“%d ”,a[i]);
}
(3)用多维数组名做函数参数
int fun1(int b[ ][4])
{……}
int fun2(int c[3][4])
{……}
main()
{ int a[3][4];
fun(a);
fun(a);
……
}
3局部变量和全局变量
变量按其作用域分类可分为局部变量和全局变量。
局部变量:在一个函数内部定义的变量。
有效范围:只在本函数范围内有效。
全局变量:在函数外部定义的变量(又叫外部变量)。
有效范围: 从定义变量的位置开始到本源文件结束,可以为本文件其他函数所共用。
-
函数内部定义的变量(局部变量) , 只在该函数范围内有效。(main主函数也不例外) 一个函数不能使用其他函数中定义的变量.
-
不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。
-
形式参数也是局部变量。
-
可以在复合语句中定义变量, 这些变量只在复合语句中有效。
4用static声明局部变量
有时希望函数中的局部变量的值,在调用结束后不消失,而保留原值。即其占用的存储单元不释放,下次调用该函数时,该变量已有值(上一次调用结束时的值)。这时应定义该局部变量为“局部静态变量”,用static加以声明。
加C/C++学习交.流群获取C语言、C++、Windows高级编程,MFC框架编程、QT框架编程,Linux应用程序开发,Linux内核研究等系统学习路线,更有进阶干货的直播免费学习权限
,都是大牛带飞 让你少走很多的弯路的 群…号是 787190917
对局部静态变量的4点说明:
1、局部静态变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(局部动态变量)属于动态存储类别,占动态存储区空间,函数调用结束就释放。
2、对局部静态变量,只在编译时赋初值一次,以后每次调用函数时不再重新赋初值,而只是保留上次函数调用结束时的值。而对自动变量赋初值,不是在编译时进行的, 而是在函数调用时进行。每调用一次函数,重新给自动变量赋一次初值。
3、若定义局部变量不赋初值的话,对静态变量来说,编译时自动赋初值0(数值型)或空字符(字符型)。而对自动变量来说,它的值是一个不确定的值。因为每次函数调用结束后存储单元已释放,下次调用又重新分配单元,而所分配的单元中的值是不确定的。
4、虽然局部静态变量在函数调用结束后仍然存在,但其它函数不能引用它。
以下2种情况需要用局部静态变量:
(1)需要保留函数上一次调用结束时的值。
(2)如果初始化后,变量只被引用而不改变其值,这时用局部静态变量比较方便,以免每次调用时重新赋值。
用静态存储要多占内存,降低了程序的可读性,调用次数多时往往弄不清局部静态变量的当前值是什么。因此,要少用局部静态变量。
—END—